Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';我是否继续执行Perl 5.10中的下一个when块?_Perl_Switch Statement_Continue - Fatal编程技术网

为什么';我是否继续执行Perl 5.10中的下一个when块?

为什么';我是否继续执行Perl 5.10中的下一个when块?,perl,switch-statement,continue,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”我认为您可能误解了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”

我认为您可能误解了
continue
的目的或交换机构造中故障的性质

当块以隐式中断结束时,每个
,因此在成功匹配后退出给定的
。所有
continue
所做的就是告诉
给定的
块在出现
条件时继续处理
,而不中断。它不会强制下一个
条件(当它不是时)神奇地变为真

考虑这个,它会输出两次

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        continue;
    }
    when ( /1/ ) {
        say '1 again';
    }
}
请参见手册页:

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

该代码输出1和2:

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

由于给定的不是循环构造(尽管它支持continue,这在该实例中是特例),因此请使用foreach或类似用法:

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

for(expression)将$设置为表达式,在某些情况下,在给定/何时之前,该行为用于模拟开关。

为什么希望它输出2<代码>$x
为1。请参阅我的编辑。。。仍然不工作该选项将不工作,因为给定的
$x
复制到
$\u
,这是智能匹配的参数。如果您在第一个
中设置
$\u2
,当
时,它将起作用。FWIW,我展示了学习Perl第五版中的一个扩展示例,它解决了这个问题。:)此外,对于在家玩的任何人,请使用5.10.1。智能匹配在5.10.0中被破坏。我认为我误解的根源是C,在“开关”中的fall through没有做任何额外的测试。。。它只是通过并执行下一个块。