2次元以上のハッシュ配列のコピーに注意!

2次元以上のハッシュ配列の場合、要素名で示されるのは値ではなくリファレンスであるため、別のハッシュ配列にコピーしてもそのリファレンスがコピーされることになる。従って別のハッシュ配列にコピーしたと思ってコピー先の値を変更すると、同じリファレンスを持つ元のハッシュ配列の値も変更されてしまうことになる。 あー日本語じゃ説明しづらい!以下が再現コード! #!/usr/bin/perl -w use strict; my $var; my $varN; my @ar; my @arN; my %hs; my %hsN; my %dhs; my %dhsN; $var = “aaa”; $varN = $var; $varN = “bbb”; my $x = \$var; my $y = \$varN; print “—Output of Variable\n”; print “$var\n”; print “$x\n”; print “$varN\n”; print “$y\n”; @ar[0] = “aaa”; @arN = @ar; @arN[0] = “bbb”; my $i = \@ar; my $j = \@arN; print “—Output of Array\n”; print “@ar[0]\n”; print “$i\n”; print “@arN[0]\n”; print “$j\n”; $hs{‘var1’} = “aaa”; %hsN = %hs; $hsN{‘var1’} = “bbb”; my $a = \$hs{‘var1’}; my $b = \$hsN{‘var1’}; print “—Output of Hash array(Single Dimension)\n”; print “$hs{‘var1’}\n”; print “$a\n”; print “$hsN{‘var1’}\n”; print “$b\n”; $dhs{‘var1’}{‘var2’} = “aaa”; %dhsN = %dhs; $dhsN{‘var1’}{‘var2’} = “bbb”; my $c = \$dhs{‘var1’}{‘var2’}; my $d = \$dhsN{‘var1’}{‘var2’}; print “—Output of Hash array(Double Dimension)\n”; print “$dhs{‘var1’}{‘var2’}\n”; print “$c\n”; print “$dhsN{‘var1’}{‘var2’}\n”; print “$d\n”; そして出力はこんな漢字! —Output of Variable aaa SCALAR(0x87130ac) bbb SCALAR(0x87130cc) —Output of Array aaa ARRAY(0x871311c) bbb ARRAY(0x87130fc) —Output of Hash array(Single Dimension) aaa SCALAR(0x871322c) bbb SCALAR(0x87139cc) —Output of Hash array(Double Dimension) bbb SCALAR(0x86f97a4) bbb SCALAR(0x86f97a4) うわーこれはわからんわー。gnview直さなきゃ〜・・・。

comments powered by Disqus