Perl の foreach 文
かれこれ6年以上間違った知識で Perl とつきあっていたみたいなのだが。
Perl の foreach 文での「配列の各々の要素」っていうやつを変更すると、配列内の要素そのものが変更される、っていうことに今日初めて気付いた。 たとえばこんなふうに。
1: my @array = ("aa", "bb", "cc", "dd");
2:
3: foreach my $each (@array) {
4: $each .= "+aa";
5: }
6: foreach my $each (@array) {
7: print "$eachn";
8: }
なコードがある場合、その結果は:
aa+aa
bb+aa
cc+aa
dd+aa
と 配列の要素はすべて 4行目にある "+aa" の追加がされる。 今日までは、3行目の foreach で @array の要素が一つずつコピーされて、foreach のスコープのなかで $each をどうしようと @array には影響しないなんて考えていたのだが、実際はそうでないってことだった。 配列の要素の値を変更したくない場合には、実際にはこのように別の変数に値をコピーしてやらないとダメなのですね。
1: my @array = ("aa", "bb", "cc", "dd");
2:
3: foreach my $each (@array) {
4: my $tmp = $each;
5: $tmp .= "+aa";
6: }
7: foreach my $each (@array) {
8: print "$eachn";
9: }
今までの僕のやりかただと、@array の値を変更するときにはこんなことしていたんだよねぇ。
for (my $i = 0; $i < $#array; $i++) {
$array[$i] .= "+aa";
}
これからは foreach で配列の要素の値が変更できる・される って肝に命じてコード書きますよ。
それにしても、よくもこれまで問題起きずに済ましてきたよなぁ…。
コメント
コメントを投稿