break是否在给定/ when(aka switch)之外定义了行为?

时间:2012-01-12 11:05:02

标签: perl switch-statement undefined-behavior

更新

明显的问题只是由于我的示例脚本中的拼写错误,如@ M42所述。 eval隐藏了在没有break的情况下执行given导致的错误。 $@中的错误消息是:

Can't "break" outside a given block

所以情况很清楚,根本没有问题。要结束这个问题。

另一次更新

但是,似乎有点不一致;在一个案例中警告但在另一个案件中没有警告:

$ perl5.12.4 -WE "eval { say 0; say 1 if last; say 2 }; warn if $@; say 3"
0
Can't "break" outside a given block at -e line 1.
        ...caught at -e line 1.
3

$ perl5.12.4 -WE "eval { say 0; say 1 if last; say 2 }; warn if $@; say 3"
0
Exiting eval via last at -e line 1.
Can't "last" outside a loop block at -e line 1.
        ...caught at -e line 1.
3

perl5.14.1的相同输出。

想知道为什么那些不是编译时错误。毕竟它们是语法错误。

并且消息显示,当实施证明我们可以时,我们无法通过lastbreak退出 - 程序只是继续。 eval真的应该抓住这些破碎的代码吗?只是一个用户想知道...

原帖

在代码审核中,我刚看到复制/粘贴given/when/break,其中given/when被删除,break被遗留下来。代码编译并运行时没有警告。这引出了我的问题:

break是否定义了given/when以外的行为?

我在perlsyn找不到任何权威的内容。我无法从以下程序的输出中看出break - 基本原理:

use 5.010;
use strict;
use warnings;

sub bla {
    my @args = @_;
    eval {
        for ( @args ) {
            say;
            if ( $_ eq 'blub' ) {
                say '==> break';
                break;
            }
            say 'nach if';
        }
        say 'nach for';
    };
    say 'eval Ende';
    say 'sub Ende';
}

bla qw/ eins zwei blub drei /;

say for '-' x 40;

eval {
    say 'im eval';
    say '==> break';
    break:
    say 'immer noch im eval';
};
say 'nach dem eval';

与5.10.1,5.12.4和5.14.1相同的输出。请注意,在第一个示例中,将跳过所有eval/for/if,而在第二个示例中,eval会继续。

eins
nach if
zwei
nach if
blub
==> break
eval Ende
sub Ende
----------------------------------------
im eval
==> break
immer noch im eval
nach dem eval

那么它是未定义的行为吗?或者你有任何相关的文档指针?

1 个答案:

答案 0 :(得分:3)

在中断指令后放置分号而不是冒号

break;

使用冒号将其视为标签。