Perlでは、割り当ての結果(および配列やハッシュとの操作)はコンテキストによって異なります。
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20
ハッシュの場合:
my %h = (a=>1, b=>2, c=>3); my $size = %h; # $size == 3 現代のPerlバージョンではですが、以前はそうではありませんでした!
内容をコピーする代わりに配列への参照を全体として割り当てることに注意してください!
配列への参照の割り当てと配列の内容をコピーすることの違いは何ですか?
回答:
my @a = (1,2,3); my $ref = \@a; # $refは配列への参照で、$refを介した変更は@aに反映されます my @b = @a; # @bは新しい配列で、@bの変更は@aには影響しません # 比較: push @$ref, 4; # @aは今(1,2,3,4) push @b, 5; # @aは(1,2,3,4)のままで、@bは(1,2,3,5)
物語 1
プロジェクトでは、配列をサブプログラムに参照として渡しましたが、その参照が何であるかわからなかったため、関数が呼び出し元で変更しました。バグが発生しました — 呼び出し元のコードではデータ構造が既に「破壊されて」いました。コピーを期待して、エイリアスを取得しました。
物語 2
エンジニアは、スカラー割り当て
%hが実際のペア数を返すと考えていました。実際、古いPerlバージョンではこの動作は異なり、スロット/バケットの数が返ってきて、長さではありませんでした! 結果的に、時々3ではなく別の数字が返され、統計が壊れました。
物語 3
大規模なETLシステムで、配列が参照を介してコピーされ、意図せずお互いのデータを上書きしてしまいました。なぜなら、全員が同じ配列を操作しており、独立したコピーではなかったからです。エラーの診断には数日かかりました。