2010-10-22 12 views
6

ben yazdım özelleştirilmiş karşılaştırma altprogramıyla sort kullanıyorum: bazen daha argümanları almak benim special_compare istiyorumBağımsız değişkenleri Perl'deki sıralama alt yordamına iletebilir miyim?

sub special_compare { 
# calc something using $a and $b 
# return value 
} 

my @sorted = sort special_compare @list; 

Ben iyi kullanım $a ve otomatik olarak ayarlanır $b olduğunu biliyorum, ama, örneğin:

sub special_compare { 
my ($a, $b, @more) = @_; # or maybe 'my @more = @_;' ? 
# calc something using $a, $b and @more 
# return value 
} 

Bunu nasıl yapabilirim?

cevap

11

sort BLOCK LIST sözdizimini kullanın, bkz. perldoc -f sort. Yukarıdaki special_compare alt yazılı varsa

, sen mesela yapabilirsiniz:

my @sorted = sort { special_compare($a, $b, @more) } @list; 
+0

+1 güzel ve basit! –

+3

Her zaman kopyalanmasını durdurmak için '@ daha 'bir referansı iletmek isteyebilirsiniz. –

+0

Ya da uygunsa, bir alt çağırmak yerine hat içi kodu kullanın. – mscha

3
sort Değişmeze yerine kapatılmasını kullanabilirsiniz

: Eğer geçmek istiyorsanız

my @more; 
my $sub = sub {   
    # calc something using $a, $b and @more 
}; 

my @sorted = sort $sub @list; 

@_'da karşılaştırılacak öğeler, alt yordamının prototipini ($$) olarak ayarlar. Not: Bu, kısıtlanmamış alt programdan daha yavaştır.

+0

mscha'nın çözümü daha temiz ve çalışıyor görünüyor. Kullanmamanın bir sebebi var mı? –

+0

@David: kapatma kullanılarak daha verimli olabilir. Ben benchmark koşmadım. –

+2

Performans bir değerlendirmedir ve karşılaştırma işlevi ağırsa, [Schwartzian dönüşümü] 'ne (http://en.wikipedia.org/wiki/Schwartzian_transform) bakın. – mscha

İlgili konular