早めにブロックを反復する
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";
}