代码之家  ›  专栏  ›  技术社区  ›  JoelFan

为什么在Perl5.10中不继续执行下一个when块?

  •  2
  • JoelFan  · 技术社区  · 14 年前

    当我运行这个时:

    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 回复  |  直到 14 年前
        1
  •  9
  •   mikegrb    14 年前

    perlsyn 手册页:

    给定(expr)将把expr的值赋给块的词法范围内的$\

    此代码输出1和2:

    use feature ':5.10';
    $x=1;
    given ($x) {
        when(1) {
            say '1';
            $_ = 2;
            continue;
        }
        when (2) {
            say '2';
        }
    }
    
        2
  •  4
  •   friedo    14 年前

    我想你可能误解了 continue 或者交换机结构中的fallthrough的性质。

    每个 when 块以隐式分隔符结尾,因此 given 成功匹配后退出。所有 持续 是不是告诉你 鉴于 块以继续处理 什么时候 条件和不爆发。它不会强迫下一个 什么时候 条件是当它不是真的时候,奇迹般地成为真的。

    想想这个,它 输出两次。

    use feature ':5.10';
    $x=1;
    given ($x) {
        when(1) {
            say '1';
            continue;
        }
        when ( /1/ ) {
            say '1 again';
        }
    }
    
        3
  •  0
  •   MkV    14 年前

    因为给定的不是循环构造(尽管它支持continue,在该实例中是特殊情况),所以使用foreach或类似的方法:

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

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