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 で配列の要素の値が変更できる・される って肝に命じてコード書きますよ。



それにしても、よくもこれまで問題起きずに済ましてきたよなぁ…。

コメント

このブログの人気の投稿

パスワードを覚えるのも無理があるから、パスワードマネージャ使いましょう。

大型特殊自動車免許を取った時の話。

車両系建設機械運転者(整地) の講習