continue

while や foreach の後ろにブロックを追加する

構文

解説

continue は後ろに BLOCK が続くかどうかで用途が大きく異なります。

BLOCK が後続する場合

continueBLOCK が後続するなら、 continue は関数というよりかはフロー制御文です。 もし ブロック (通常は whileforeach) に 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, redocontinue ブロックの中でも使えます。 とりわけ、lastnext はメインブロックで実行されたかのように振る舞います。 next もそうなのですが、 メインブロックで使ったとき、continue ブロックを実行してしまうので、その点は他と違うかもしれません。

while (EXPR) {
    ### redo は常にここに来ます
    do_something;
} continue {
    ### next は常にここに来ます
    do_something_else;
    # その後、EXPR を再チェックのために先頭に戻ります
}
### last は常にここに来ます

メインブロックの nextcontinue を実行してしまうのは奇妙に感じるかもしれません。 しかし、continue セクションを省略した場合、それは空の continue を使うのと同じと考えれば、メインブロックの next が 条件チェックのために直接ループの先頭に戻るように見えるのは無理もありません。

BLOCK が後続しない場合

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