ハッシュのハッシュのコピー

ハッシュのハッシュをサブルーチンに渡すとき、リファレンスを使う。けど値渡しをしたい。このとき、リファレンスの中身を単純にコピーしただけではうまくいかない。ハッシュの中のハッシュはリファレンスなので、コピーしたハッシュの中身には当然リファレンスが入っている。リファレンスを介して値を変更するのであれば値渡しにならない。以下のスクリプトでイコールなコピーと手動なコピーの結果を試してみると良くわかる。

 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);
 }