while や foreach の後ろにブロックを追加する
continue
は後ろに BLOCK が続くかどうかで用途が大きく異なります。
continue
に BLOCK が後続するなら、
continue
は関数というよりかはフロー制御文です。
もし ブロック (通常は while
か foreach
) に
continue
ブロック (BLOCK のこと) が取り付けられていれば、
次に条件が評価される直前に BLOCK が毎度実行されます。
これは C 言語の for
ループの 3 つ目の式と良く似ています。
そのため、これはループ変数のインクリメントにも使えます。
さらに、これは next
文によってループが先送りされる場合でも有効です
(これは C 言語の continue
に似ています)。
my $i = 0;
while ( $i < 10 ) {
print $i, "\n";
}
continue {
$i++;
}
上記コードは実質的に次の for
文と同じです。
for ( my $i = 0 ; $i < 10 ; $i++ ) {
print $i, "\n";
}
last
, next
,
redo
は continue
ブロックの中でも使えます。
とりわけ、last
と next
はメインブロックで実行されたかのように振る舞います。
next
もそうなのですが、
メインブロックで使ったとき、continue
ブロックを実行してしまうので、その点は他と違うかもしれません。
while (EXPR) {
### redo は常にここに来ます
do_something;
} continue {
### next は常にここに来ます
do_something_else;
# その後、EXPR を再チェックのために先頭に戻ります
}
### last は常にここに来ます
メインブロックの next
が continue
を実行してしまうのは奇妙に感じるかもしれません。
しかし、continue
セクションを省略した場合、それは空の continue
を使うのと同じと考えれば、メインブロックの next
が
条件チェックのために直接ループの先頭に戻るように見えるのは無理もありません。
BLOCK が無い場合、continue
は関数であり、
進行中の when
または default
ブロックに落ちます。
動的に囲んでいる foreach
を繰り返すこともしませんし、
レキシカルに囲んでいる given
を抜け出すこともありません。
use v5.10.1;
my $var = 'Hello World';
given ($var) {
when (/Hello/) { say 'Hello'; continue; }
when (/World/) { say 'World'; continue; }
default { say 'Default'; }
}
上記サンプルコードでは、Hello, World, Defaut すべてが出力されることになります。
Perl 5.14 以前では、continue
のこの形式は、
"switch"
feature
が有効のときだけ使うことができました。
詳細は feature および
"Switch
Statements" in perlsyn
をご覧ください。