Question

I have an Array of Hashes in a Hash that looks like this:

$var  = {
      'items' => [
                      {
                        'name'  => 'name1',
                        'type'  => 'type1',
                        'width' => 'width1',
                      },
                      {
                        'name'  => 'name2',
                        'type'  => 'type2',
                        'width' => 'width2',
                      },
                      {
                        'name'  => 'name3',
                        'type'  => 'type3',
                        'width' => 'width3',
                      }                      
                   ]
    };

I wrote the following code to get the values from a file.

my @members = ("name"    =>  $name,
               "type"    =>  $type,
               "width"   =>  $width);

$rec->{$items} = [ @members ];

push @var, $rec;

I am not sure how to retrieve the values from this data structure.

I saw the solution in Iterate through Array of Hashes in a Hash in Perl. But I did not understand it. I am not sure what was $filelist that they had mentioned in the code.

foreach my $file (@{ $filelist{file} }) {
    print "path: $file->{pathname}; size: $file->{size}; ...\n";
}

I am new to perl and please provide me details in your reply.

No correct solution

OTHER TIPS

An excellent reference for data structures like the one you're dealing with is Perl's Data Structures Cookbook.

That said, here is the code:

for my $item (@{$aoh->{items}}) {
    # '@' casts the $aoh->{items} hash references to an array
    print $item->{name};
}

First of all the structure in that question like

$VAR1 = {
          'file' => [
                      {
                        'pathname' => './out.log',
                        'size' => '51',
                        'name' => 'out.log',
                        'time' => '1345799296'
                      },
.
.
.
}

is actually print or output of the hashref $filelist. Data::Dumper module which helps in printing the structures like hashref, arrayref, etc. in a way that you can read properly.

So $VAR1 is nothing but $filelist printed using Dumper.

Now, about the foreach loop iterating through values:

foreach my $file (@{ $filelist{file} })

Here, the $filelist{file} part returns the array reference (Note: [, ] represents arrayref).

Now, when you use @{} on this arrayref i.e. @{ $filelist{file} }, this converts or expands as array.

Once we get the arrayref converted to array type, we can iterate using foreach.

Please note that when you use $hashrefname->{$key}, it means hashref accessing the key, $hashname{$key} means hash accessing key. Same is for arrayef and array, but instead of keys there are numbers to acess in case of array.

Solution for your problem:

You need to store the members as hashref and not array i.e.

my $member = {"name"    =>  $name,
               "type"    =>  $type,
               "width"   =>  $width};

Then you can push this each hashref that you read from file(i am guessing it is from file) into the array

push @arr, $member

And then assign the arrayref to the items

$rec->{items} = \@arr

Now you can access values as

foreach my $eachhashref (@{$rec->{items}})
{
print $eachhashref->{name}
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top