http://www.perlmonks.org?node_id=814639


in reply to Re: Finding hashes in hashes of hashes
in thread Finding hashes in hashes of hashes

Thanks for you answer. It solves my problem! No, it is not my homework (got something else). I'm just trying to create a script where I need something similar (no families and no flinstones ;). I didn't want to write the full code, since I only need this in a single sub. I am using strict, warnings, diagnostics and even perlcritic (cruel). I played around with something like this:
get_family_member('bart',$families); sub get_family_member { my @args = @_; my $who = shift @args; my $families = shift @args; foreach my $family (%families) { if ($families->{$family}->{kid} eq "bart") { return $dfamilies->{$family}->{kid}; last; } } }
but where would I say, it should die, when 'bart' is not found? It has been a while since I used perl the last time. I returned, because I missed the nice community and CPAN. However, since I used some more exotic languages (far away from C-like styles and paradigms) I guess I need to rewire my brain. I hope I remember correctly, how Perls scopes and datatypes work. Maybe I should just try to find my old perl books.

Replies are listed 'Best First'.
Re^3: Finding hashes in hashes of hashes
by bobf (Monsignor) on Dec 28, 2009 at 18:49 UTC

    The 'die' would go after the foreach (refer to the pseudocode that I posted). Note the comments below:

    sub get_family_member { my @args = @_; my $who = shift @args; # <-- this var is not used my $families = shift @args; foreach my $family (%families) { if ($families->{$family}->{kid} eq "bart") { # <-- are you sure yo +u want to hard-code 'bart'? I think you need $who return $dfamilies->{$family}->{kid}; # <-- typo in hash name last; # <-- this will never be reached since it already returned } } # no matches found: die here }

      bobf is quite right: the statements
          my @args = @_;
          my $who = shift @args;
          my $families = shift @args;
      are much better written as
          my ($who, $families) = @_;

      Also,  $families in the above example seems to be a hash reference,
      so use  %$families to dereference.

      Further,
          for my $family (%$families) { ... }
      won't do what you want; use
          for my $family (keys %$families) { ... }
      to iterate over the keys of the referenced hash.

      Thank you! About the typo and the who.. This is what happens, when you try to change your code to only reflect relevant parts. Next time I'll simply copy it.