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
をご覧ください。