早めにブロックを反復する
next は、C 言語の continue 文と同様に、
該当のループの次の反復を開始します。
LINE: while (<STDIN>) {
next LINE if /^#/; # コメントならその行は破棄する
#...
}
もし上記コードに continue ブロックがあれば、
行を破棄したときでさえ、その continue ブロックは実行されます。
LABEL が省略されると、最も内側のループを参照します。
next EXPR という書き方は Perl 5.18.0 から使えるようになりましたが、
これによって実行時にラベル名を算出することができるようになりました。それ以外は next LABEL と同等です。
my $labelname = 'LINE';
LINE: while (<STDIN>) {
next $labelname if /^#/; # コメントならその行は破棄する
#...
}
next は、eval {}, sub {}, do {}
などのように、一般的に値を返すようなブロックから値を返すことはできません。
next はフロー制御の振る舞いを実行し、一切の戻り値を除外します。
そのため、grep や map
の処理を抜け出すために last を使ってはいけません。
なお、ブロックは意味的には一度だけ実行されるループと同義と捉えることも可能です。
そのため、next はそのようなブロックから早い段階で抜け出すことができます。
前述の通り、値を返さないブロックであれば、ループでなくても next は使えます。
{
my $num = int( rand(10) ); # 0 から 9 までの整数
next if $num % 2; # $num が奇数ならブロックを抜け出す
print "${num}\n";
}