Programmingデータエンジニア

Perlで配列やハッシュのリストおよびスカラー割り当てを使用する際の注意点は何ですか?データ構造を操作する際の一般的な誤りを避ける方法は?

Hintsage AIアシスタントで面接を突破

回答

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システムで、配列が参照を介してコピーされ、意図せずお互いのデータを上書きしてしまいました。なぜなら、全員が同じ配列を操作しており、独立したコピーではなかったからです。エラーの診断には数日かかりました。