Ten bit kodu zachowuje się inaczej pod Perl 5.8 niż to robi pod Perl 5.12:Jaka jest różnica w opóźnionej ocenie kodu w podprogramach dla 5.8 vs. 5.10 i 5.12 Perla?
my $badcode = sub { 1/0 };
print "Made it past the bad code.\n";
Kiedy uruchomić go pod 5.8, pojawia się błąd, chociaż nie mogę wykonać podział:
[[email protected] tmp]$ /usr/bin/perl -v This is perl, v5.8.8 built for i486-linux-gnu-thread-multi [[email protected] tmp]$ /usr/bin/perl badcode.pl Illegal division by zero at badcode.pl line 1. [[email protected] tmp]$ /usr/local/bin/perl -v This is perl 5, version 12, subversion 0 (v5.12.0) built for i686-linux [[email protected] tmp]$ /usr/local/bin/perl badcode.pl Made it past the bad code.
pod Perl 5.10.1, to zachowuje się jak to robi pod 5.12:
[email protected]:/var/tmp$ perl -v This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi [email protected]:/var/tmp$ perl badcode.pl Made it past the bad code.
uzyskać takie same wyniki przy nazwie podprogramu, np
sub badcode { 1/0 }
Nic nie widzę w tym zestawie perl5100delta. Czy to nieudokumentowana zmiana? Niezamierzony efekt uboczny jakiejś innej zmiany? (Dla przypomnienia, myślę, 5,10 i 5,12 robią słusznie.)
Nie znam odpowiedzi, ale wydaje mi się, że Perl 5.10+ również odroczył optymalizacje leksykalne, takie jak wstępne obliczanie '1/0'. Nie jestem pewien, czy którykolwiek sposób jest uważany za "właściwą rzecz". – spoulson