in reply to Re: specific array in hash of arrays
in thread specific array in hash of arrays

moritz explained, so what follows is a solution. Basically, comparing a single value against an array makes so sense. By using grep, the value can be compared against every element of the array.

#!/usr/bin/perl use strict; use warnings; my %hoa = ( arraya => [qw( dd1 dd2 dd3 dd4 )], arrayb => [qw( gg1 gg2 gg3 gg4 )], arrayc => [qw( cc1 cc2 cc3 cc4 )], ); chomp( my $array_name = <STDIN> ); # e.g. arraya chomp( my $to_find = <STDIN> ); # e.g. dd2 if ( exists( $hoa{$array_name} ) && grep { $_ eq $to_find } @{$hoa{$array_name}} ) { print( @{$hoa{$array_name}}, "\n" ); }

Replies are listed 'Best First'.
Re^3: specific array in hash of arrays
by gone2015 (Deacon) on Oct 09, 2008 at 13:54 UTC

    Though looking up a hash will often be better than doing a linear search along a list. For example:

    #!/usr/bin/perl use strict; use warnings; my %hoh = ( flasha => { dd1 => 1, dd2 => 2, dd3 => 3, dd4 => 4 }, flashb => { gg1 => 1, gg2 => 2, gg3 => 3, gg4 => 4 }, flashc => { cc1 => 1, cc2 => 2, cc3 => 3, cc4 => 4 }, ); for ([qw(flasha dd4)], [qw(glashz gg2)], [qw(flashc zz)], [qw(flashc c +c1)]) { my ($array_name, $to_find) = @$_ ; if (exists $hoh{$array_name}->{$to_find}) { print( "$array_name contains $to_find\n" ); } }
    noting that exists stops looking, without complaint, if $hoh{$array_name} doesn't exist.

    If the list is a trivial length, then List::Util::first at least stops looking when it gets a match.

    I don't know what you need to do having discovered the match... the above allows you to map "array name" and "to_find" to anything you like -- the numbers above are for illustration, only !

    If you're only interested in existence, then

    flasha => { map { ($_, undef) } qw(dd1 dd2 dd3 dd4) },
    will serve.

      if (exists $hoh{$array_name}->{$to_find}) {
      should normally be
      if ( exists( $hoh{$array_name} ) && exists( $hoh{$array_name}->{$to_find} ) ) {

      to prevent autovivification of entries into %hoh. That might not matter here, though.

        Rats... "autovivication" :-(

        Just when I thought I was getting to grips with Perl magic, another piece bites me in the backside... "autovivifying" an rvalue ? ...of course, silly me !

Re^3: specific array in hash of arrays
by kwn (Novice) on Oct 09, 2008 at 11:23 UTC
    I think you answered my question as I was writing it! Awesome thanks.