The foreach statement
Programming Perl Chapter 1(p.34) には
Note that the loop variable refers to the element itself, rather than a copy of the element. Hence, modifying the loop variable also modifies the original array.
とある。
"the loop variable refers to the element itself"
http://d.hatena.ne.jp/perlcodesample/20091120/1246679588 の「コメントに対する回答」には
itouhiroさんのコメント
Perl5の「foreach」は、myをつけても、myをつけた新変数ではなく、配列内部の変数に直接アクセスしてしまうという変なクセがある。だからforeachに限ってmyは無意味。Perlの文法はこういう例外も覚えないとならない
変数としてはまったく新しいものです。ですから意味はあります。foreachが少し変なのはその変数の内容に配列の要素のエイリアスが設定されるということです。スカラ値のコピーはPerlの処理の中でも遅い部類に入るためスカラ値のコピーをしたくないというのが理由でだと思います。「パフォーマンスを考慮した結果」の例外だと思います。
でも実際にプログラムをしてみるとわかりますがそれほど困ることはないです。(値を書き換える場合についてはエイリアスがわたってくるということは意識しないといけませんが。)
と回答がある。ちょっとややこしいので、検証してみた結果が以下。勘違いしているとわけのわからないところで嵌りそう。
検証コード
use Data::Dumper; my @hoge = 1 .. 10; my @fuga = @hoge; my @foo = @hoge; print "-" x 30 . "\n"; print Dumper \@hoge, \@fuga, \@foo; foreach (@hoge) { $_ += 30; } foreach my $item (@fuga) { $item += 30; } foreach my $item (@foo) { my $bar = $item; $bar += 30; } print "-" x 30 . "\n"; print Dumper \@hoge, \@fuga, \@foo;
output
------------------------------ $VAR1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; $VAR2 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; $VAR3 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; ------------------------------ $VAR1 = [ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 ]; $VAR2 = [ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 ]; $VAR3 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
http://codepad.org/1XvvYiyx で実際の実行結果を確認できます。