Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I use of arrays of arrays, no problem. Even arrays of hashes, no problem. But now, I find myself at a loss with an array of array of hashes.
Lets pretend we have 3 schoolclasses, with about 20 kids in each class. Each kid has name, address etc etc.
So, I have put the data into the array of array of hashes, and I need to be able to read them again. I know the data is in the right place, I just dont know how to get it out. I see no reason why
$kid[0][0]{name}
should not work, but perl says
Not an ARRAY reference.
Any ideas?

Replies are listed 'Best First'.
Re: Array of Array of Hashes
by dpuu (Chaplain) on Aug 06, 2002 at 20:22 UTC
    You doen't provide the code you're using to create your AoAoH; but I can suggest a debug approach:
    use Data::Dumper; print Dumper($kid[0]);
    This will tell you what perl thinks you've created. --Dave
Re: Array of Array of Hashes
by DamnDirtyApe (Curate) on Aug 06, 2002 at 20:46 UTC

    As twerq said, you need to dereference your array. Here's an example showing you how you might access your data:

    #! perl use strict ; use warnings ; $|++ ; my @AoAoH = ( [ # Class 1 { 'name' => 'Bilbo Baggins', 'address' => 'The Shire', 'phone' => '555-9898' }, { 'name' => 'Frodo Baggins', 'address' => 'The Shire', 'phone' => '555-6767' } ], [ # Class 2 { 'name' => 'Gandalf', 'address' => 'Middle Earth', 'phone' => '555-1313' }, { 'name' => 'Sauron', 'address' => 'Mordor', 'phone' => '555-6666' } ], [ # Class 3 { 'name' => 'Peregrin Took', 'address' => 'The Shire', 'phone' => '555-2424' }, { 'name' => 'Samwise Gamgee', 'address' => 'The Shire', 'phone' => '555-2323' } ], ) ; print $AoAoH[0][0]{'name'}, "\n" ; my $AoAoH_ref = \@AoAoH ; print $AoAoH_ref->[1][1]{'name'}, "\n" ; __END__

    _______________
    DamnDirtyApe
    Those who know that they are profound strive for clarity. Those who
    would like to seem profound to the crowd strive for obscurity.
                --Friedrich Nietzsche

      ...you know, now that I think about it, I have to agree with what twerq and dpuu said originally: We need to see your initialization code.

      In this example from DamnDirtyApe, the initial attempt to refer to the data is identical to your original.  $kid[0][0]{name} is the same as:  $AoAoH[0][0]{name}

      As long as you always refer to your data in this fashion (using a formally named variable "kid" or "AoAoH" you can treat the data structure as if it were in fact a simple multi-dimensioned construct. It is when you try to iterate through the individual data items that you have to be aware that the array named "kid" is simply an array of references (or pointers to you C programmers).

      So if you decided to do something like:

      foreach $class (@kids) { # inspect each top level (class) array # here, $class is a reference to an array, so... foreach $student (@$class) { # here, $student is a reference to a hash, so... print "$student->{'name'}\n"; # or you can iterate: foreach $fact (keys %{$student}) { # note that protecting $student with surrounding # curly braces will make keys() a lot happier # I like to pronounce the construct as: # "The hash to which $student refers" # and we may now print: print "$fact: $student->{$fact}\n"; # or if you are in a particularly perverse mood, you may say: print "$fact: $$student{$fact}\n"; # if you DO find yourself in that mood though, consider # adjusting your meds! :-) } } }

      ...all the world looks like -well- all the world, when your hammer is perl.
      ---v

Re: Array of Array of Hashes
by twerq (Deacon) on Aug 06, 2002 at 20:24 UTC
    Haven't seen the code you're working with, but maybe try dereferencing with
    $kid[0][0]->{name}

    --twerq
      ...I think this would do the trick. Or if you're in a particularly perverse mood, you might try:
      ${$kid[0][0]}{name}
      ...but it's much uglier.

      Update: changed phrase so that it actually works.

      ...all the world looks like -well- all the world, when your hammer is perl.
      ---v