为什么我的 continue 不执行 Perl 5.10 中的下一个 when 块?

发布于 2024-08-26 23:45:41 字数 291 浏览 6 评论 0原文

当我运行此命令时:

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”

When I run this:

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

This should print both 1 and 2, but it only prints 1. Am I missing something?

EDIT:

I have added $x = 2 and it still prints only "1"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

狼性发作 2024-09-02 23:45:41

请参阅 perlsyn 手册页:

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

此代码输出 1 和 2:

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

See the perlsyn man page:

given(EXPR) will assign the value of EXPR to $_ within the lexical scope of the block

This code outputs 1 and 2:

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        $_ = 2;
        continue;
    }
    when (2) {
        say '2';
    }
}
情话墙 2024-09-02 23:45:41

我认为您可能误解了 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';
    }
}

I think you may be misunderstanding the purpose of continue or the nature of fallthrough in a switch construct.

Every when block ends with an implicit break, so the given is exited upon a successful match. All continue does is tell the given block to continue processing the when conditions and not break out. It doesn't force the next when condition to magically be true when it isn't.

Consider this, which does output twice.

use feature ':5.10';
$x=1;
given ($x) {
    when(1) {
        say '1';
        continue;
    }
    when ( /1/ ) {
        say '1 again';
    }
}
痴意少年 2024-09-02 23:45:41

由于给定不是循环构造(尽管它支持 continue,这在该实例中是特殊情况),请使用 foreach 或 for 像这样:

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

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

Since given is not a loop construct (despite it supporting continue, which is special cased in that instance), use foreach or for like so:

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

for (expression) sets $_ to the expression, and that behaviour was used to emulate switch in some cases, before given/when.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文