Какая разница в отложенной оценке кода в подпрограммах для Perl 5.8 против 5.10 и 5.12? - PullRequest
8 голосов
/ 04 мая 2010

Этот бит кода ведет себя иначе в 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. Это недокументированное изменение? Непреднамеренный побочный эффект какого-либо другого изменения? (Для справки, я думаю, 5.10 и 5.12 делают правильные вещи.)

1 Ответ

17 голосов
/ 04 мая 2010

Я считаю, что это было запланировано, и я вижу упомянутое в perl5100delta.pod :

Исключения при постоянном складывании

Постоянная процедура складывания теперь завернутый в обработчик исключений, и если сворачивание выдает исключение (такое как пытаясь оценить 0/0), Perl теперь сохраняет текущий optree, а чем прерывание всей программы. Без этого изменения программы не компилировать, если у них были выражения это случилось, чтобы генерировать исключения, хотя эти выражения были в код, который никогда не может быть достигнут в во время выполнения. (Николас Кларк, Дейв Mitchell)

Это связано только с исключением с делением на ноль, которое не приводит к прерыванию на этапе компиляции.

...