foreach(あるいは for でも可)にリストを渡すと、リスト内の要素を 1 つずつ順番に処理できます。
# 現在の要素は $_ で参照できる
foreach (@arr) {
print "$_\n";
}
# 要素に名前を付けることもできる
foreach my $val (@arr) {
print "$val\n";
}
式修飾子 (expression modifier) を使って次のように 1 文で書くこともできます。
for ループを式修飾子として記述する場合、各要素は必ず $_ で参照することになります。
print "$_\n" foreach @arr;
Perl では、C 言語風に for ループを記述することもできます。
for ($i = 0; $i < 10; ++$i) {
print "$i\n";
}
Perl の処理系は foreach と for を同じものとみなすので、foreach と書ける場所ではいつでも for と書くことができます(慣れてくるとタイプ数を減らすために全部 for と書くようになります)。
内部的には、for の後ろの括弧の中にセミコロンが 2 つある場合は、C 言語風の for ループとして処理され、それ以外の場合は foreach ループとして処理されます。
print for 1..10;
print foreach 1..10;
foreach (for) ループを途中で抜ける場合は、last 演算子を使います(C 言語の break のようなもの)。
for (1..10) {
print "$_\n";
last if $_ == 5; # 5 ならループを抜ける
}
foreach (for) ループで次の繰り返しへジャンプするには、next 演算子を使います(C 言語の continue のようなもの)。
for (1..10) {
next if $_ % 2 == 0; # 偶数なら次の繰り返しへ
print "$_\n";
}
foreach (for) ループで、現在の繰り返しをもう一度実行する(ブロックの先頭に戻る)には redo 演算子を使います(C 言語にはこのようなものはありません)。
for (1..10) {
print "$_\n";
print "Redo? (Y/N): ";
chomp (my $line = <STDIN>);
redo if $line =~ /^Y$/i;
}
ループ制御演算子 (last, next, redo) を一番内側のループ以外に作用させたい場合は、ラベル付きブロックを使い、ループ制御演算子にそのラベルを指定します。
LINE: while (<>) {
for (split) {
last LINE if /__END__/;
...
}
}