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


in reply to Extracting values from nested hashrefs

I am not sure whether map plus double values counts as implicit traversing:
say for map values %$_, values %$animals;
Update: simplified.
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Replies are listed 'Best First'.
Re^2: Extracting values from nested hashrefs
by loris (Hermit) on Sep 12, 2012 at 09:35 UTC

    Ah, sorry, my example was too simple. It should have been like this:

    my $animals = { gnu => { humps => 0, mascot_for => 'emacs', }, dromedary => { humps => 1, mascot_for => 'perl', }, camel => { humps => 2, mascot_for => 'perl', }, };

    BTW, implicit traversing is OK; I just wanted to avoid some sort of loop with , say while.

    Thanks,

    loris

      You can use
      map $_->{humps}, values %$animals;
      If your structure becomes even more complicated (e.g. different level of nesting), you should use recursion (or CPAN).
      لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

      Here is an approach that should work no matter how complicated your data structure becomes (provided the data you want remains in the form humps => d):

      #! perl use strict; use warnings; use Data::Dumper; my $animals = { gnu => { humps => 0, mascot_for => 'emacs', }, dromedary => { humps => 1, mascot_for => 'perl', }, camel => { humps => 2, mascot_for => 'perl', }, }; my $flat = Dumper($animals); print "$1\n" while $flat =~ / 'humps' \s+ => \s+ (\d+) /gx;

      Output:

      2 0 1

      TMTOWTDI.

      Athanasius <°(((><contra mundum