perlのリファレンス

ハッシュのリファレンスと無名ハッシュの違いを今日味わいました。

sub myfunc {
    my $s = shift;
    my(%ta) = ('a' => "a$s", 'b' => "b$s");
    return %ta;
}

foreach (qw/x y z/) {
    %a = myfunc($_);
    push(@z, \%a);
}
foreach (@z) {
    print $_->{'a'} . ':' . $_->{'b'} . "\n";
}

において、

ax:bx
ay:by
az:bz

という答えを期待している、つまり、順番に処理した関数の戻り値を保持した配列を期待している場合にはうまくいかない。これは配列にリファレンスが格納されてあり、結局のところ、最後の関数の戻り値を参照してしまうのだ。期待通りに動かしたい場合は、

    push(@z, \%a);

    push(@z, {%a});

に変更する必要がある。つまり、無名ハッシュで包んで配列の要素にその無名ハッシュを代入する必要があるということ。

いやぁ、ハマった。まだまだあまちゃんだな。