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

I'm looking at the example of a has of complex records from http://perldoc.perl.org/perldsc.html#Declaration-of-a-HASH-OF-COMPLEX-RECORDS
%TV = ( flintstones => { series => "flintstones", nights => [ qw(monday thursday friday) ], members => [ { name => "fred", role => "lead", age => 36, }, { name => "wilma", role => "wife", age => 31, }, { name => "pebbles", role => "kid", age => 4, }, ], }, jetsons => { series => "jetsons", nights => [ qw(wednesday saturday) ], members => [ { name => "george", role => "lead", age => 41, }, { name => "jane", role => "wife", age => 39, }, { name => "elroy", role => "kid", age => 9, }, ], }, simpsons => { series => "simpsons", nights => [ qw(monday) ], members => [ { name => "homer", role => "lead", age => 34, }, { name => "marge", role => "wife", age => 37, }, { name => "bart", role => "kid", age => 11, }, ], }, ); foreach ( %TV ) { print "%_\n"; }
If I put this in a script and try to print out each entry in the %TV hash, I would expect to get three results:
flintstones jetsons simpsons
but instead I get:
simpsons HASH(0x237a120) jetsons HASH(0x2379e80) flintstones HASH(0x2379bc8)
Is there something wrong with the example? Or am I accessing the data incorrectly? this is with Perl 5.14.2 on Windows.

Replies are listed 'Best First'.
Re: hash of complex records example
by toolic (Bishop) on Jan 09, 2014 at 00:34 UTC
    print "%_\n";
    I think your code is really:
    print "$_\n";

    Use keys:

    foreach (keys %TV ) { print "$_\n"; }

    Use sort if you want the output order to be predictable ( perldsc).

    foreach (sort keys %TV ) { print "$_\n"; }

      If you want to understand properly, divide the parsing into small steps. Make use of above reply by toolic. Below is the full parser for hash %TV

      foreach my $k1 (keys %TV ) { print "\n# Hash Key = $k1\n"; # flintstones, jetsons, simpsons foreach my $v1 ($TV{$k1}) { foreach my $k2 (keys %$v1) { print "## Hash Hash key = $k2\n"; # series, nights, member +s if(ref($$v1{$k2}) eq 'ARRAY') { foreach my $h (@{$$v1{$k2}}) { if (ref($h) eq 'HASH') { foreach my $k3 (keys %$h) { print "$k3 => $$h{$k3}\n"; # member detail +s } } else { print "$h\n"; # night values } } } else { print "$$v1{$k2}\n"; # series value } } } }

        Thanks! The "keys" part is what I was missing. The "%_" was just a typo in the original post.