为什么我的继续执行Perl 5.10中的下一个块?

时间:2010-03-29 16:27:59

标签: perl switch-statement continue

当我运行时:

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”

3 个答案:

答案 0 :(得分:9)

请参阅perlsyn手册页:

  

给定(EXPR)将在块的词法范围内将EXPR的值赋给$ _

此代码输出1和2:

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

答案 1 :(得分:4)

我认为你可能误解了continue的目的或者转换构造中的堕落性质。

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

考虑一下,输出两次。

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

答案 2 :(得分:0)

由于给定的不是循环结构(尽管它支持continue,在该实例中是特殊的),使用foreach或类似的结果:

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

for(expression)将$ _设置为表达式,并且在某些情况下,在给定/何时使用该行为来模拟switch。