in reply to Accessing an AoHoAoH

A couple of thoughts:

1) As a stylistic preference, whenever I construct a nested data variable in perl, I always start with a scalar variable at the top, like '$dataroot'. I like the way it looks and it's flexible, since a scalar can hold a reference to anything. You'll notice that Data::Dumper does the same thing when it spits out ($VAR1 $VAR2 etc..) as the topmost 'container' of the output.

2) Using the style mentioned above helps me focus more on the *meaning* of what it is I am really storing, helps keeps things readable. Given this style, your example becomes this slightly different code ...

use strict; use warnings; my $chapters = [ { title => 'Basic', page => [ { paragraph => 'lesson1'}, { paragraph => 'lesson2'}, ], }, { title => 'Advanced', page => [ { paragraph => 'lesson3'}, { paragraph => 'lesson4'}, ], }, ]; ### since we started with a scalar to hold ### an anonymous array ref, we have to ### use the little 'arrow' notation print $chapters->[0]{title}; ### basic print "\n---------------\n"; print $chapters->[1]{title}; ### advanced print "\n---------------\n"; print $chapters->[1]{page}[0]{paragraph}; ### lesson3 print "\n---------------\n"; print $chapters->[1]{page}[1]{paragraph}; ### lesson4 print "\n---------------\n";

Replies are listed 'Best First'.
Re^2: Accessing an AoHoAoH
by bradcathey (Prior) on Jun 05, 2004 at 21:36 UTC
    Good stuff, scooterm. Observation: with the scalar, it's brackets all the way. Question: does assigning the data structure to the scalar automatically make it a reference? So, there's no need to:
    $chapters = \$chapters;
    Right? Thanks.

    —Brad
    "A little yeast leavens the whole dough."

      You guessed it. You get to use square brackets for an array, and curly braces for an hash, and the syntax stays consistent thru the whole thing, no matter how deeply your data gets nested.

      The only time it gets a little 'funky' is when you want to treat your data like a regular array, for example, in a foreach loop. Actually, perldsc lays it all out.

      ### here we tell perl to treat the scalar as a ref ### to an array. foreach my $item (@{$chapters}){ print $item->{title}; }

      Side note: Data::Dumper is absolutely a plus. Sprinkle it into every script where you use a complex variable, in fact, sprinkle it everywhere. It's very useful.

      Assigning a reference to a scalar.. makes the scalar contain a reference! Theres no need to "initialize with a reference to itself as you seem to think. You do need to actually initialize something with a reference before you try to dereference it, unless strict is off.