2010-10-22 25 views
6

Tôi đang sử dụng sort với một chương trình con so sánh tùy Tôi đã viết:Tôi có thể chuyển đối số cho chương trình con so sánh sắp xếp trong Perl không?

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

my @sorted = sort special_compare @list; 

Tôi biết đó là tốt nhất sử dụng $a$b được tự động thiết lập, nhưng đôi khi tôi muốn special_compare tôi để có thêm lý lẽ, tức là:

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

Làm cách nào để làm điều đó?

Trả lời

11

Sử dụng cú pháp sort BLOCK LIST, xem perldoc -f sort.

Nếu bạn đã viết các special_compare phụ ở trên, bạn có thể làm, ví dụ:

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

+1 đẹp và đơn giản! –

+3

Bạn có thể muốn chuyển một tham chiếu đến '@ more' để ngăn nó được sao chép mọi lúc. –

+0

Hoặc chỉ sử dụng mã nội tuyến thay vì gọi một phụ, nếu thích hợp. – mscha

3

Bạn có thể sử dụng đóng cửa ở vị trí của loại chương trình con:

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

my @sorted = sort $sub @list; 

Nếu bạn muốn vượt qua các yếu tố được so sánh trong @_, đặt nguyên mẫu của chương trình con thành ($$). Lưu ý: điều này chậm hơn so với chương trình con không được định kiểu.

+0

Dung dịch của mscha sạch hơn và có vẻ hiệu quả. Bạn có thấy lý do nào không sử dụng nó không? –

+0

@David: việc đóng cửa có thể hiệu quả hơn. Tôi đã không chạy điểm chuẩn mặc dù. –

+2

Nếu hiệu suất là một xem xét và chức năng so sánh là nặng, hãy xem [biến đổi Schwartz] (http://en.wikipedia.org/wiki/Schwartzian_transform). – mscha

Các vấn đề liên quan