3.6 foreach制御構文

配列を処理するには便利そうなforeach。
さすが文字列を処理するのが得意なPerlです。


実際に動くところを見たいので、
例題を書き写してみます。

#!/usr/bin/perl -w
use strict;

my $rock;
foreach $rock (qw/ bedrock slate lava /) {
 print "One rock is $rock.\n"; #3つの岩の名前を表示する。
}

とすれば、
One rock is bedrock.
One rock is slate.
One rock is lava.
と表示される。
ほうほう、なるほど。
配列の要素を全部処理し終えれば
ループを抜けるんですね。
配列の要素数を明示的に求めなくても
処理できるのは、便利ですね。


配列の勉強のために、
@hogeを使って同様の処理をする場合も
考えてみます。

#!/usr/bin/perl -w
use strict;

my @rocks = qw/ bedrock slate lava /;

foreach my $rock (@rocks) {
print "One rock is $rock.\n"; #3つの岩の名前を表示する。
}

foreachの中でmyで宣言するのが
マナーとしてよいのかどうかわかりませんが、
ワーニングも出ずに動きます。
なるほどねぇ。


と思ったら、直後にほぼ同じ例題がありました。
use strictを使っていないので、
宣言してませんが。
ついでにこれもやってみよう。

#!/usr/bin/perl -w
use strict;

my @rocks = qw/ bedrock slate lava /;

foreach my $rock (@rocks) {
 $rock = "\t$rock";
 $rock .= "\n";
}
print "The rocks are:\n", @rocks;

で、
The rocks are:
bedrock
slate
lave
となる。
制御変数をループ内で変更できるってことですね。


加えて、

  • 制御変数はループが終了すると、ループが開始する前の値に戻る。

んだそうです。
ってことは、上記のプログラムの末尾に
print "One rock is:\n", $rock;
なんて書いても、宣言されたのが制御変数としてなので、
コンパイルエラーになっちゃうよ、ってことですね。


試したら、確かにそうなりました。:-)