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


in reply to iterate through a hash with two keys

What you are doing is trying to assign a value, but not correctly. To assign $value, you could do something like this...

$hash{$_}{$label} = $value for 'a' .. 'h';
To print the value, use print, printf, or say with the same type of a structure.

--MidLifeXis

Replies are listed 'Best First'.
Re^2: iterate through a hash with two keys
by hdb (Monsignor) on Apr 29, 2013 at 19:58 UTC

    Independent of your solution to fionbarr's question and his real intention, I have tried to correct his code in the following way:

    use strict; use warnings; my %hash; my $label = "label"; my $value = "value"; # this does not work !!! @hash{ 'a'..'h' } = ( { $label => $value } ) x 9; $hash{ 'a' }{ $label } = "newvalue"; print $hash{ 'b' }{ $label },"\n"; # is "newvalue" !!!

    This results in a structure where $hash{'a'} to $hash{'h'} all point to the same hash, so changing one changes all of them.

    Is there a way to have the x operator really create 9 independent hash refs? (If this is helpful here or not is a different question.)

    The following code works but is too cumbersome.

    use strict; use warnings; my %hash; my $label = "label"; my $value = "value"; # this works !!! @hash{ 'a'..'h' } = ( { $label => $value }, { $label => $value }, { $label => $value }, { $label => $value }, { $label => $value }, { $label => $value }, { $label => $value }, { $label => $value }, { $label => $value }, ); $hash{ 'a' }{ $label } = "newvalue"; print $hash{ 'b' }{ $label },"\n"; # is "value" !!!

      map { { $label => $value } } 1 .. 9?

      What you are doing is creating the hashref, and duplicating the same hashref that number of times.

      --MidLifeXis

Re^2: iterate through a hash with two keys
by fionbarr (Friar) on Apr 29, 2013 at 18:02 UTC
    I am using xml_writer and I want to do this: for ('a' .. 'c') { $xml_writer->dataElement("LastName" => $t{A}{LastName}); } where the hash was filled by $t{A}{LastName} = "Smith"