break

given ブロックを抜ける

構文

解説

break は、given-when 文による switch 構文において、 when ブロック内で呼び出すことで given ブロックを抜けます。 しかし、when ブロックの最後で暗黙的に break が呼び出されるため、 通常は明示的に break を呼び出す必要はありません。

なお、given-when 文は実験的な実装であり、 Perl v5.10.1 以降から利用できます。この構文を使う場合は、use v5.10.1; (v5.10.1 以降なら何でも構いません) を宣言しておく必要がありますので注意してください。

実際にはこの構文は Perl v5.10.0 から実装されていたようですが、v5.10.0 では期待通りに動作しないようです。 そのため、v5.10.1 以降で使えると考えて差し支えありません。

use v5.10.1;

my $var = 'Hello World';

given ($var) {
    when (/Hello/) { say 'Hello' }
    when (/World/) { say 'World' }
    default       { say 'Default' }
}

上記コードは、スカラー変数 $var の値に Hello が含まれれば Hello と、 World が含まれれば World と出力し、いずれにも該当しなければ Default と出力します。 結果的に上記コードは Hello と出力されて、該当の when ブロックを抜け、 さらには given ブロックを抜けます。

上記コードは次のコードと同じです。

use v5.10.1;

my $var = 'Hello World';

given ($var) {
    when (/Hello/) { say 'Hello';   break; }
    when (/World/) { say 'World';   break; }
    default        { say 'Default'; break; }
}

break を明示的に記述するとすれば、 when ブロックが実行された際に、何かしらの条件によって when ブロックを途中で抜けたい場合が挙げられるでしょう。

あまり実用的な例ではありませんが、次のコードはスカラー変数 $var に Hello が含まれている場合、もしスカラー変数 $name に値がセットされていなければ when ブロックおよび given ブロックを抜けます。

use v5.10.1;

my $var  = 'Hello World';
my $name = 'Taro';

given ($var) {
    when (/Hello/) {
        print 'Hello';
        unless ($name) {
            print "\n";
            break;
        }
        say ' ' . $name;
    }
    when (/World/) { say 'World'; }
    default        { say 'Default'; }
}

上記コードはスカラー変数 $name に何もセットされていなければ "Hello" とだけ出力されます。そして、$name に "Taro" がセットされていれば "Hello Taro" と出力されます。