2

これを実行すると:

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        $x = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}

これは 1 と 2 の両方を出力するはずですが、1 しか出力しません。

編集:

$x = 2 を追加しましたが、まだ「1」しか出力されません

4

3 に答える 3

9

perlsynのman ページを参照してください。

given(EXPR) はブロックのレキシカルスコープ内で EXPR の値を $_ に代入します

このコードは 1 と 2 を出力します。

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        $_ = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}
于 2010-03-29T16:55:05.580 に答える
4

continueswitch コンストラクトにおけるフォールスルーの目的または性質を誤解している可能性があると思います。

すべてwhenのブロックは暗黙的なブレークで終了するため、given一致が成功すると終了します。すべては、条件の処理を続行し、ブレークアウトしないようにブロックにcontinue指示することです。次の条件が真ではない場合、魔法のように真になることを強制しません。givenwhenwhen

これを考えてみましょう。これ2 回出力します。

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        continue;
    }
    when ( /1/ ) {
        say '1 again';
    }
}
于 2010-03-29T16:33:48.893 に答える
0

given はループ コンストラクトではないため (continue をサポートしているにもかかわらず、その場合は特殊なケースです)、 foreach または for を次のように使用します。

use feature ':5.10';
$x=1;
for ($x) {
    when(1) {
        say '1';
        $x = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}

for (expression) は $_ を式に設定し、その動作は場合によっては、given/when の前にスイッチをエミュレートするために使用されました。

于 2010-03-29T23:57:28.347 に答える