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


in reply to iterate through a hash with two keys

Not sure what you want ...

... if $label should be variable, try

 print $hash{$_}{$label} for keys %hash

Update:

or shorter

 print $_->{$label} for values %hash

Cheers Rolf

( addicted to the Perl Programming Language)

errata

s/values/keys/ in first expression

Replies are listed 'Best First'.
Re^2: iterate through a hash with two keys
by fionbarr (Friar) on Apr 29, 2013 at 17:45 UTC
    I didn't ask the question properly. I want to print all the labels and values for each of 'a' .. 'h' the label is a variable. I am filling this hash like: $hash{a}{$label} = $value; where $label is a text string.
      This may be what you want.
      use strict; use warnings; my $label1 = 'L1'; my $label2 = 'L2'; my %hash; @hash{'a' .. 'h'} = ( {$label1 => 1 }, {$label1 => 2 }, {$label2 => 3 }, {$label1 => 4 }, {$label2 => 5 }, {$label1 => 6 }, {$label2 => 7 }, {$label1 => 8 }, ); while ( my( $key,$subhash ) = each %hash) { print "$key: $subhash->{$label1}\n" if exists $subhash->{$label1}; }
      OUTPUT:
      a: 1 d: 4 h: 8 b: 2 f: 6
      Bill
      > I didn't ask the question properly.

      indeed!

      > I want to print all the labels and values for each of a .. h

      DB<103> @hash{$_} = {x=>$x++,y=>$x++} for a..h => "" DB<112> while ( my ($k1,$v1) = each %hash ) { while ( my ($k2,$v2) = each %$v1 ) { print "$k1 - $k2 -$v2\n" } } e - y -25 e - x -24 a - y -17 a - x -16 d - y -23 d - x -22 ... # and so on

      But are you looking for Data::Dumper ?

      UPDATE

      DB<106> print Dumper \%hash $VAR1 = { 'e' => { 'y' => 9, 'x' => 8 }, 'a' => { 'y' => 1, 'x' => 0 }, 'd' => { 'y' => 7, 'x' => 6 }, 'c' => { 'y' => 5, 'x' => 4 }, ...

      FWIW I prefer Data::Dump or YAML¹, but Data::Dumper is core.

      Cheers Rolf

      ( addicted to the Perl Programming Language)

      ¹) interesting Module::Build::YAML was first released with perl 5.009004

      UPDATE YAML
      DB<106> use YAML::Tiny => 0 DB<107> Dump(\%hash) --- a: x: 16 y: 17 b: x: 18 y: 19 c: x: 20 y: 21 d: x: 22 y: 23 ...
        doing it like this:
        my @array = qw( FirstName LastName MiddleName LegalInd DateOfBirth Sex Race Ethnicity Height Weight Build Eyes Hair SocSecNo MaritalStatus PlaceOfBirthCit +y PlaceOfBirthState AddressType DfAdate StreetNumber StreetName StreetType City State Zip ); for (@array) { $xml_writer->dataElement("$_" => $t{A}{$_}); }