1

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.

1
  • $var is a reference to a hash, and one of the elements of that hash (the only one so far) is the items array. Do you need to have any other elements besides items in that hash? Commented Mar 2, 2014 at 4:59

2 Answers 2

3

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};
}
Sign up to request clarification or add additional context in comments.

Comments

1

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}
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.