2015-05-12 17 views
7

benzeyen bazı eski Perl mücadele muyum şu: İki farklı sistemlerde, iki farklı PERL tesisat/versiyonları, bu kod farklı davranışlar gösterir Açıkperl dize enterpolasyon

sub UNIVERSAL::has_sub_class { 
    my ($package,$class) = @_; 
    my $all = all_packages(); 
    print "$package - $class", "\n"; 
    print "$package::$class", "\n"; 
    return exists $all->{"$package::$class"}; 
} 

, "$package::$class" yapıdır yani tek bir sistemde doğru paket adına doğru şekilde çözümlendi, ancak diğerinde değil. İki farklı sistemlerde has_sub_class çalıştırırken

aşağıdaki farklı print çıkışları

görülebilir:

# print output on system 1 (perl v5.8.6): 
webmars::parameter=HASH(0xee93d0) - webmars::parameter::date 
webmars::parameter::date 

# print output on system 2 (perl v5.18.1): 
webmars::parameter=HASH(0x251c500) - webmars::parameter::date 
webmars::parameter=HASH(0x251c500)::webmars::parameter::date 

sen kudretini biliyor perl v5.8.6 ve perl v5.18.1 arasında herhangi bir dize enterpolasyon değişiklikler oldu mu Bu davranışa neden olur? Yoksa başka bir yere mi bakmalıyım? Gerçekten de etrafta dolaşmayı ve perl değişim notlarını okuyarak denedim, ancak ilgi çekici bir şey bulamadım.

Sınırlı bilgi birikimimle, sahip olduğum sorunu çoğaltabilecek en küçük kod parçasını almayı denedim. Ben umut takipçinizin geldi alakalı:

# system 1 (perl v5.8.6): 
$ perl -e 'my %x=(),$x=bless(\%x),$y='bar';print "$x::$y\n";' 
bar 

# system 2 (perl v5.18.1): 
$ perl -e 'my %x=(),$x=bless(\%x),$y='bar';print "$x::$y\n";' 
main=HASH(0xec0ce0)::bar 

çıkışları farklıdır! Herhangi bir fikir ?

perl -Mstrict -we 'my %x=(),$x=bless(\%x),$y="bar";print "$x::$y\n";' 

(sürümüne, ben 'bar' için bareword uyarı olsun) kullanılarak -

+0

'perl -Mstrict -we '% x =(), $ x = bless (\% x), $ y =' bar '; yazdırma" $ x :: $ y \ n "; –

+2

Could bültenleri arasında araya giren 6 yıl içinde oldukça kolay bir hata olabilir :). Ama böyle bir özlü MCVE için aferin! – Sobrique

cevap

4

Daha kısa gösteri:

($x::, $x) = (1,2); print "$x::$x" 

$ perl5.16.3 -e '($x::, $x) = (1,2); print "$x::$x"' 
12 

$ perl5.18.1 -e '($x::, $x) = (1,2); print "$x::$x"' 
2::2 

sıcak alınıyor.

$ perl5.16.3 -MO=Concise =e 'print "$x::$x"' 
8 <@> leave[1 ref] vKP/REFC ->(end) 
1  <0> enter ->2 
2  <;> nextstate(main 1 -e:1) v:{ ->3 
7  <@> print vK ->8 
3  <0> pushmark s ->4 
-  <1> ex-stringify sK/1 ->7 
-   <0> ex-pushmark s ->4 
6   <2> concat[t3] sK/2 ->7 
-    <1> ex-rv2sv sK/1 ->5 
4     <#> gvsv[*x::] s ->5   <-  $x:: 
-    <1> ex-rv2sv sK/1 ->6 
5     <#> gvsv[*x] s ->6   <-  $x 
-e syntax OK 

$ perl5.18.1 -MO=Concise -e 'print "$x::$x"' 
a <@> leave[1 ref] vKP/REFC ->(end) 
1  <0> enter ->2 
2  <;> nextstate(main 1 -e:1) v:{ ->3 
9  <@> print vK ->a 
3  <0> pushmark s ->4 
-  <1> ex-stringify sK/1 ->9 
-   <0> ex-pushmark s ->4 
8   <2> concat[t4] sKS/2 ->9 
6    <2> concat[t2] sK/2 ->7 
-     <1> ex-rv2sv sK/1 ->5 
4     <#> gvsv[*x] s ->5   <-  $x 
5     <$> const[PV "::"] s ->6  <-  "::" 
-    <1> ex-rv2sv sK/1 ->8 
7     <#> gvsv[*x] s ->8   <-  $x 
-e syntax OK 

TL; DR. v5.16, "$x::$x"'u $x:: . $x olarak ayrıştırır. v12.18, $x . "::" . $x. Bu değişikliğin delta docs'daki açık referansını göremiyorum ama bakmaya devam edeceğim.

+0

Gerçekten de, $ x :: olarak ayrıştırarak "$ x :: $ x" karakterine bağlı olarak sustuğunda kodda bir hata varmış gibi görünüyor. $ x', yani.'' $ package :: $ class ''' $ package '' yerine '$ package'' ı arar ve undefined olduğu için dizgede '' ile değiştirir. – Cricri

+0

Perl'in herhangi bir sürümünde çalışabilmesi için '$ {package} :: $ class' olarak yeniden yazınız. – mob

3

Yani, benim çok hızlı testi sorunu doğruluyor.

5.8.8 sürümünde aldığım hata "birleştirmedeki başlatılmamış değer kullanımı" dir. Gerçi 5.20.2 çalışıyorsa

my (%x) =(); 
my $x = bless (\%x); 
my $y = 'bar'; 
print "$x::$y\n"; 

, alıyorum::

my (%x) =(); 
my $x = bless (\%x); 
my $y = 'bar'; 
print "${x}::$y\n"; 

Yani evet, olmuştur

fark benim perl -MO=Deparse ile çalıştırdığınızda ben almak gibi görünüyor Aynı kodun nasıl ayrıldığına dair bir değişiklik. Ama belki de, size neler olduğu konusunda sizi aydınlatacak olmanın dışında, bunun size nasıl yardımcı olduğundan emin değilim.

+0

Sorunun nereden geldiğini, perl yorumcusuysa veya koddaki sorunları anlamak için bana çok yardımcı oluyor. Ve bu durumda, her ikisinin bir kombinasyonu. – Cricri

İlgili konular