2010-05-04 4 views
8

Bu kod biraz Perl 5.8 nedeniyle farklı davranışlar o Perl 5.12 altında olduğundan daha:Perl'in 5.8'e karşı 5.10 ve 5.12 için altprogramlarda kodun gecikmeli değerlendirilmesindeki fark nedir?

[[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.
:

Ben 5.8 altında çalıştırmak
my $badcode = sub { 1/0 }; 
print "Made it past the bad code.\n"; 

, ben asla bölünme yürütmek halde bir hata alıyorum

[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.

Ben isimlendirilmiş bir alt, örneğin aynı sonuçları elde: perl 5.10.1 altında

, bunun 5.12 altında gibi davranır

sub badcode { 1/0 } 

Perl5100delta bölmesinde bu konuda hiçbir şey göremiyorum. Bu belgelenmemiş bir değişiklik mi? Başka bir değişikliğin istenmeyen bir yan etkisi? (Kayıt için, ben 5.10 düşünmek ve 5.12 Doğruyu yapıyoruz.)

+0

Cevabı bilmiyorum ama Perl 5.10+ 'nin '1/0' gibi ön hesaplamalar gibi sözcüksel optimizasyonları da ertelediği görülüyor. Her iki şekilde de "Doğru Olan" kabul edilirse emin değilim. – spoulson

cevap

17

İnanıyorum bu planlandı ve bu in perl5100delta.pod belirtildiği görüyorum: Sabit katlanması

İstisnalar

sabit katlama rutini artık bir özel durum işleyicisine sarılmış ve katlama bir istisna atarsa ​​ artık ( 0/0 değerlendirme denemesi için), perl şimdiki programın iptal edilmesinden ziyade geçerli olanı korur. Onlar bu ifadeler zamanında ulaşılabilir asla kodunda idi rağmen istisnalar oluşturmak oldu ifadeleri olsaydı bu değişiklik olmadan , programlar derlemek olmaz. (Nicholas Clark, Dave Mitchell)

Sadece bölünmüş-by-sıfıra istisnası derleme aşamalı iptale sonuçlanmayan ile ilgisi vardır.

+0

Teşekkürler, Evan. Şimdi bu kodun bir kenar durumunu test etmek için kullandığım gibi, 5.7 perl altında test edilmesinde nasıl çalışılacağını anlamaya ihtiyacım var. * grumble * – Brock

+0

@Brock: Bunu yapmak zorunda kalmadığımdan işe yarayacağından emin değilsiniz, ancak bir "eval" sarmalayıcı kullanarak hatayı yakalamayı düşündünüz mü? – Zaid

+0

@Zaid hayır, çünkü op-tree üretimi sırasında değerlendirmeden önce sabit bir katlanma olur. eval sadece bir op-tree'i önbelleğe alır. ex, 'eval {1/1}', çalışma zamanında “eval {1}” den farklı değildir. –

İlgili konular