コードのその部分を理解するために、私たちは三つの明確にする必要があります。
評価順序:
EXPR_A = EXPR_B
はEXPR_A
を評価する前にEXPR_B
を評価します。
コピーセマンティクス:@new_array
にオーバー
@new_array = @old_array
コピー@old_array
の値を。
複雑なデータ構造の間接参照:
@{ $trades{$key} }
%trades
はハッシュで$key
というエントリにアクセスし、配列リファレンスとして扱い。
が foreach my $row (@$rows) {
my @copy = @$row;
my $key = pop @$row;
@{ $trades{$key} } = @copy;
}
例えばので
(すべての副作用を維持しながら、私が見ることができる)
$rows = [
[1, 2, "keyA"],
[3, 4, "keyB"],
];
が
を作成します。一緒に
は、あなたのコードは、これに相当します
%trades = (
keyA => [1, 2, "keyA"],
keyB => [3, 4, "keyB"],
);
$rows = [
[1, 2],
[3, 4],
];
この行を書いた人は、評価の順序について非常に正確な知識を持ち、メンテナンスプログラマーを悩ますのが大好きです。
ちょうどスタイルノート:これは一般的に言語の "Perl"、プログラムの "perl"です。 Shiftキーが押されていない限り、PERLではありません。 :) – cHao
'$ trades {pop @ $ row} = $ row;'または 'my $ id = pop @ $ row;と書くこともできます。 $ trades {$ id} = $ row; ' – ikegami
@ ikegami:いいえ。 – Borodin