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;
なんて書いても、宣言されたのが制御変数としてなので、
コンパイルエラーになっちゃうよ、ってことですね。
試したら、確かにそうなりました。:-)