这部分代码在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 This is perl, v5.8.8 built for i486-linux-gnu-thread-multi [brock@chase tmp]$ /usr/bin/perl badcode.pl Illegal division by zero at badcode.pl line 1. [brock@chase tmp]$ /usr/local/bin/perl -v This is perl 5, version 12, subversion 0 (v5.12.0) built for i686-linux [brock@chase tmp]$ /usr/local/bin/perl badcode.pl Made it past the bad code.
Under perl 5.10.1, it behaves as it does under 5.12:
brock@laptop:/var/tmp$ perl -v This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi brock@laptop:/var/tmp$ perl badcode.pl Made it past the bad code.
I get the same results with a named subroutine, e.g.
sub badcode { 1 / 0 }
我在perl5100delta容器中看不到任何有关此的信息。这是未记录的更改吗?其他变化的意外副作用? (根据记录,我认为5.10和5.12做的正确。)
最佳答案
我相信这是有计划的,而且我确实提到了in perl5100delta.pod:
恒定折叠的例外
固定折叠程序现在是
包装在异常处理程序中,以及
如果折叠引发异常(例如
尝试评估0/0时),perl
现在保留当前的optree,而不是
而不是中止整个程序。
没有此更改,程序将
如果他们有表达式,则不编译
碰巧会产生异常,
即使这些表情在
永远无法达到的代码
运行。 (尼古拉斯·克拉克,戴夫
米切尔)
它只是与被零除的异常有关,不会导致编译阶段中止。