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手册页:

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

我认为您可能误解continue了 switch 构造中失败的目的或性质。

每个when块都以隐式中断结束,因此在given成功匹配时退出。所做continue的只是告诉given块继续处理when条件而不是突破。当它不是时,它不会强迫下一个when条件神奇地为真。

考虑一下这个,它确实输出了两次。

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) 将 $_ 设置为表达式,并且在某些情况下,在给定/何时之前,该行为用于模拟 switch。

于 2010-03-29T23:57:28.347 回答