Search code examples
perl

How to iterate an array just retrieved from a hash?


I'm trying to iterate an array which I just retrieved from a hash:

my %h = (
  'z' => ['1', '2', '3'],
  'b' => ['x', 'y'],
);
my @a = $h{'b'};
foreach my $k (@a) {
  print "[$k]";
}

However, instead of [x][y] it prints:

[ARRAY(0x7fc6f2825de8)]

Why?


Solution

  • Since:

    'b' => ['x', 'y']
    

    Then:

    my @a = $h{'b'};
    

    Is the same as

    my @a = ['x', 'y'];
    

    Which is an array where the first element of the array is another array. Its a two-dimensional array.

    If you want to print the array in one go, you have to dereference the second level:

    print @$k;
    

    If you do not want it to be two-dimensional, you can use dereference it when assigning:

    my @a = @{ $h{'b'} };
    

    Be aware that this will not deep copy your hash values.

    Or better yet, just copy the reference:

    my $aref = $h{'b'};
    
    for my $k (@$aref) {
        print "[$k]";
    }