8

这段代码在 Perl 5.8 下的行为与在 Perl 5.12 下的行为不同:

my $badcode = sub { 1 / 0 };
print "Made it past the bad code.\n";

当我在 5.8 下运行它时,即使我从未执行过除法,也会出现错误:

[brock@chase tmp]$ /usr/bin/perl -v  

这是为 i486-linux-gnu-thread-multi 构建的 perl,v5.8.8

[brock@chase tmp]$ /usr/bin/perl badcode.pl  
在 badcode.pl 第 1 行非法除以零。

[brock@chase tmp]$ /usr/local/bin/perl -v  

这是为 i686-linux 构建的 perl 5,版本 12,subversion 0 (v5.12.0)  

[brock@chase tmp]$ /usr/local/bin/perl badcode.pl  
使它通过了错误的代码。

在 perl 5.10.1 下,它的行为与 5.12 下一样:

brock@laptop:/var/tmp$ perl -v

这是为 i486-linux-gnu-thread-multi 构建的 perl,v5.10.1 (*)

brock@laptop:/var/tmp$ perl badcode.pl  
使它通过了错误的代码。

我使用命名子程序得到相同的结果,例如

sub badcode { 1 / 0 }

我在 perl5100delta pod 中没有看到任何关于此的内容。这是一个未记录的更改吗?其他一些变化的意外副作用?(作为记录,我认为 5.10 和 5.12 正在做正确的事情。)

4

1 回答 1

17

我相信这是计划好的,我确实在 perl5100delta.pod中看到了这一点:

常量折叠的异常

常量折叠例程现在包装在异常处理程序中,如果折叠抛出异常(例如尝试评估 0/0),perl 现在保留当前 optree,而不是中止整个程序。如果没有此更改,如果程序有表达式碰巧产生异常,则程序将无法编译,即使这些表达式位于运行时永远无法访问的代码中。(尼古拉斯·克拉克、戴夫·米切尔)

它只是与除零异常有关,不会导致编译阶段中止。

于 2010-05-04T19:18:00.340 回答