ハッシュのハッシュのコピー
ハッシュのハッシュをサブルーチンに渡すとき、リファレンスを使う。けど値渡しをしたい。このとき、リファレンスの中身を単純にコピーしただけではうまくいかない。ハッシュの中のハッシュはリファレンスなので、コピーしたハッシュの中身には当然リファレンスが入っている。リファレンスを介して値を変更するのであれば値渡しにならない。以下のスクリプトでイコールなコピーと手動なコピーの結果を試してみると良くわかる。
use strict; use Data::Dumper; my %alignment; for my $i (0..1) { for my $j (0..1) { $alignment{$i}{$j} = "#"; } } change(\%alignment); exit; sub change { # 単純なコピーではだめ #my %local_alignment = %alignment; my %local_alignment; foreach my $key1 (keys %alignment) { foreach my $key2 (keys %{$alignment{$key1} } ) { $local_alignment{$key1}{$key2} = $alignment{$key1}{$key2}; } } print Dumper(\%alignment); print Dumper(\%local_alignment); $local_alignment{1}{1} = 2; print Dumper(\%alignment); print Dumper(\%local_alignment); }