在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.
在perl 5.10.1下,它的行为与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.
我使用命名子例程获得相同的结果,例如
sub badcode { 1 / 0 }
我在perl5100delta pod中没有看到任何相关内容。这是一个无证的变化吗?其他一些变化的意外副作用? (为了记录,我认为5.10和5.12正在做正确的事。)
答案 0 :(得分:17)
我相信这是有计划的,我确实看到了这提到in perl5100delta.pod:
持续折叠的异常
现在是常量折叠程序 包装在异常处理程序中,和 如果折叠抛出异常(例如 试图评估0/0),perl 现在保留当前的optree,而不是 而不是中止整个计划。 没有这种改变,程序就会 如果他们有表达式,则不编译 碰巧产生异常, 即使这些表达是在 永远无法达到的代码 运行。 (尼古拉斯克拉克,戴夫 米切尔)
它只是处理除零的异常而不会导致编译阶段中止。