2015-01-13 14 views
9

Bu, Perl v5.22'de giderilmiştir.Perl v5.18'in sıralaması sözcüksel alt yordamları anlıyor mu?

sort ile

mu Perl v5.18 en sözcük alt rutinler ? Sonunda, bugün daha derin parçalara bakmak için veri yapısındaki mevcut konuma bağlı olarak karmaşık bir sıralama rutininim olduğu bir kullanımım vardı. Hala isimlendirilmiş bir alt programın %main:: bakarak çünkü

use v5.18; 
use feature qw(lexical_subs); 
no warnings qw(experimental::lexical_subs); 

my sub by_numbers { $a <=> $b } 

my @sorted = sort by_numbers qw(4 8 2 3 0 5 7 6 1 9); 

say "sorted: @sorted"; 

Görünüşe sıralama bundan haberi yok: İşte

küçük bir programı var

% perl5.18.2 test.pl 
Undefined sort subroutine "main::by_numbers" called at test.pl line 7. 

% perl5.20.1 test.pl 
Undefined sort subroutine "main::by_numbers" called at test.pl line 7. 

bu çünkü ben biraz hayal kırıklığına uğrattı rjbs'un lexical subroutines in perl 5'da kullandığı ilk kullanım durumu.


Ben testin yerine v5.18 sürümünde güncel sürümü baktı çünkü bu bölüm önemli değil.

Ben t/op/in the perl source lexsub.t, ben sort dahil üç test bulmak bekliyoruz. İzole koşarken başarısız olurlar ve büyük ölçüde farklıdırlar: sembol tablosunda aynı isimde tanımlanmış bir alt rutin vardır (rjbs notları gibi, bu testler geçerli kaynaktan gelir ve etkilenen kararlı sürümlerde mevcut değildir).

use v5.18; 
use feature qw(lexical_subs); 
no warnings qw(experimental::lexical_subs); 

use Test::More; 

sub _cmp { $a cmp $b } 
sub bar::_cmp { $b cmp $a } 
{ 
    package bar; 
    our sub _cmp; 
    package main; 
    is join(" ", sort _cmp split //, 'oursub'), 'u u s r o b', 'sort our_sub' 
} 


{ 
    state sub _cmp { $b cmp $a } 
    is join(" ", sort _cmp split //, 'lexsub'), 'x u s l e b', 
    'sort state_sub LIST' 
} 

{ 
    my sub _cmp { $b cmp $a } 
    is join(" ", sort _cmp split //, 'lexsub'), 'x u s l e b', 
    'sort my_sub LIST' 
} 

sort tamamen (Perls v5.18 ve v5.20 için) her durumda sözcük altyordamlarını yok sayar: o çevreyi izole etmek başarısız beri sorunlu olmanın bu test yanında

not ok 1 - sort our_sub 
# Failed test 'sort our_sub' 
# at test.pl line 29. 
#   got: 'b o r s u u' 
#  expected: 'u u s r o b' 
not ok 2 - sort state_sub LIST 
# Failed test 'sort state_sub LIST' 
# at test.pl line 35. 
#   got: 'b e l s u x' 
#  expected: 'x u s l e b' 
not ok 3 - sort my_sub LIST 
# Failed test 'sort my_sub LIST' 
# at test.pl line 41. 
#   got: 'b e l s u x' 
#  expected: 'x u s l e b' 
# Tests were run but no plan was declared and done_testing() was not seen. 

, aynı zamanda var test edenin ne yaptığını ve ne kadarını, önceki testlerin ne kadarını, uzak test kurulumunu anlatmak zor. Testler kendiliğinden hafifçe belgelenir. geri kaçırdığım bir şey

Am mattering şeyler


? Bu hiç işe yaramadı. Hile o zaman, test dosyasında geçmesine izin veren nedir?

Lütfen geçici çözümler önermeyin. Bu yüzden sormuyorum.

cevap

13

Bunun v5.17.x'de çalıştığını ve sonra kırıldığını söylemek isterim, ama herkesin kaçırdığı görülüyor ve çalıştığını doğrulamayı bile özlemişim. Yani… öyle değil. Ya da çok daha mutlu bir şekilde, yapmadı. Bu giderilmiştir:

commit 2872f91877d2b05fa39d7cd030f43cd2ebc6b046 
Author: Father Chrysostomos <[email protected]> 
Date: Tue Sep 16 13:10:38 2014 -0700 

    Make sort bareword respect lexical subs 

—something I completely missed when implementing them. 

... ve beklenen ve söz verildiği gibi v5.21.4 beri, bu çalışmıştır.

+0

Ah cehennem. Son kanamayı denemeliydim biliyordum ama tembel davrandım. Testleri önceki perls'de nasıl geçiyor? –

+0

Üzgünüz, hangi testleri yaptığınızdan emin değilim. lexsub.t v5.20.0'da sıralama testleri yapmadı, örneğin: https://github.com/Perl/perl5/blob/v5.20.0/t/op/lexsub.t – rjbs

+0

Ah, şu anki kaynağa bakıyordum. Tamam, bunu açıklıyor. Bu düzeltmeler Perl'in resmi olarak desteklenen sürümlerine geri dönecek mi? –