明显的问题只是由于我的示例脚本中的拼写错误,如@ 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
的相同输出。
想知道为什么那些不是编译时错误。毕竟它们是语法错误。
并且消息显示,当实施证明我们可以时,我们无法通过last
或break
退出 - 程序只是继续。 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
那么它是未定义的行为吗?或者你有任何相关的文档指针?
答案 0 :(得分:3)
在中断指令后放置分号而不是冒号
break;
使用冒号将其视为标签。