トップ «前の日記(Wed Dec 01 2004) 最新 次の日記(Sat Dec 04 2004)» 編集

よこいまさる日記



Thu Dec 02 2004 [長年日記]

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 "$each\n";
 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 "$each\n";
 9: }

今までの僕のやりかただと、@array の値を変更するときにはこんなことしていたんだよねぇ。

 for (my $i = 0; $i < $#array; $i++) {
     $array[$i] .= "+aa";
 }

これからは foreach で配列の要素の値が変更できる・される って肝に命じてコード書きますよ。

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

今日一日

本番環境でのライブテスト前日ってこともあって、かなり気合い入れてプログラムの動き見つめながらテスト。 おおよその細かい不具合とかも取れたつもりだし。 ってことで明日はいよいよ本番でのテスト。

今日の昼は麻布十番商店街のほうまで歩いていって、紅……(名前失念) とかいう中華料理屋。 途中の麻布十番商店街の道路にヤ○ザっぽいクルマがうようよ。

あ、明日は同期のメッセンジャー友達 (と僕が勝手に設定している) に 毒男を飼いたいのですが を教えてあげよっと。 っていうか彼女は基本的に忙しいから見ている暇なさそうだけど。


2000|10|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|
あわせて読みたいブログパーツ