早めにブロックを抜け出す
last
は、C 言語の break
文 (ループの中で使われます) と同様に、
該当のループを即座に抜け出します。
LABEL が省略されると、最も内側のループを参照します。
LINE: while (<STDIN>) {
if (/^$/) {
last LINE; # 何も入力せずにエンターキーを押すとループを抜ける
}
print length, "\n";
}
last EXPR
という書き方は Perl 5.18.0 から使えるようになりましたが、
これによって実行時にラベル名を算出することができるようになりました。それ以外は last LABEL
と同等です。
my $labelname = 'LINE';
LINE: while (<STDIN>) {
if (/^$/) {
last $labelname; # last の引数にスカラー変数を指定できる
}
print length, "\n";
}
continue
ブロックがあった場合、それは実行されません。
while (EXPR) {
last;
} continue {
# last が呼び出されたらここは実行されません
}
# last が呼び出されたらここに来ます
last
は、eval {}
, sub {}
, do {}
などのように、一般的に値を返すようなブロックから値を返すことはできません。
last
はフロー制御の振る舞いを実行し、一切の戻り値を除外します。
そのため、grep
や map
の処理を抜け出すために last
を使ってはいけません。
なお、ブロックは意味的には一度だけ実行されるループと同義と捉えることも可能です。
そのため、last
はそのようなブロックの外に早い段階で抜け出す効果に使うことができます。
前述の通り、値を返さないブロックであれば、ループでなくても last
は使えます。
{
my $num = int( rand(10) ); # 0 から 9 までの整数
last if $num % 2; # $num が奇数ならブロックを抜け出す
print "${num}\n";
}