Curtis Poe <[EMAIL PROTECTED]> writes:

> foreach my $user (keys %users) {
>     foreach my $name (keys %{ $users{$user} } ) {
>         print $users{$user}{$name},"\n";
>     }
> }
> 
> Note how I wrap $users{$name} in %{...} to tell Perl that I am using a hash ref here.

A way to break this down:

foreach my $user (keys %users) {
    my $attr_href = $users{$user};
    foreach my $name (keys %{ $attr_href } ) {
        my $attr = $attr_href->{$name};
        print join "--" => $user, $name, $attr;
    }
}

For years, I had to take these simple steps to unwrap nested
references.  I had to deal with one level at a time.  I know
it seemed to waste an intermediate variable, but I couldn't
take two steps at once so I spared an intermediate variable.
It was like rock climbing -- I always put a piece of
protection in when I could.  That way, I wasn't working
sooooo far from the base that I was likely to fall.  I was
only a few feet above the last piece of protection.
Similarly, I couldn't take the double step that Curtis
showed you as a one-liner.  I had to break it down like
this.  Eventually, I could eliminate the intermediate step
(e.g. $href), but only after a lot of practice.

Oh, and using less confusing names would help a lot!!!
  my %users;
  my $user;

Too confusing.  Which is the scalar and which is the hash,
the singular or plural one?  Often, choosing good variable
names makes the problem work out better because it indicates
a well thought out design.  Name a hash for the values, not
the keys.


%attrs = (
          'user1' => {
                      'Fullname1' => 'YES'
                     },
          'user2' => {
                      'Fullname2' => 'NO'
                     },
          'user3' => {
                      'Fullname3' => 'YES'
                     }
         );

foreach $user_name (keys $attrs) {
    # intermediate protection
    my $attr_href = $attrs{$user_name};
    foreach my $attr_name (keys %{$attr_href}) {
        # intermediate protection
        my $attr_value = $attr_href->{$attr_name}; #

        print join("--" => 
                   $user_name, 
                   $attr_name,
                   $attr_value), # simple
                     "\n";

        # Should be the same.
        print join("++" =>
                   $user_name,
                   $attr_name,
                   $attrs{$user_name}{$attr_name}; # difficult
                  ),
                    "\n";
    }
}

-- 
Michael R. Wolf
    All mammals learn by playing!
       [EMAIL PROTECTED]


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to