last

早めにブロックを抜け出す

構文

解説

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 はフロー制御の振る舞いを実行し、一切の戻り値を除外します。 そのため、grepmap の処理を抜け出すために last を使ってはいけません。

なお、ブロックは意味的には一度だけ実行されるループと同義と捉えることも可能です。 そのため、last はそのようなブロックの外に早い段階で抜け出す効果に使うことができます。 前述の通り、値を返さないブロックであれば、ループでなくても last は使えます。

{
    my $num = int( rand(10) );    # 0 から 9 までの整数
    last if $num % 2;             # $num が奇数ならブロックを抜け出す
    print "${num}\n";
}