2010-10-22 2 views
6

Я использую sort с настраиваемой подпрограммой сравнения я написал:Могу ли я передать аргументы сортировке сортировки в Perl?

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

my @sorted = sort special_compare @list; 

Я знаю, что лучше использовать $a и $b, которые автоматически устанавливаются, но иногда я хочу, чтобы мой special_compare, чтобы получить больше аргументов, т.е.:

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

Как я могу это сделать?

ответ

11

Используйте синтаксис sort BLOCK LIST, см. perldoc -f sort.

Если вы написали выше special_compare к югу, вы можете сделать, например:

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

+1 приятный и простой! –

+3

Вы можете передать ссылку на '@ more', чтобы остановить ее копирование все время. –

+0

Или просто используйте встроенный код вместо вызова вспомогательного устройства, если это необходимо. – mscha

3

Вы можете использовать закрытие вместо подпрограммы сортировки:

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

my @sorted = sort $sub @list; 

Если вы хотите передать элементы, подлежащие сравнению в @_, установите прототип подпрограммы до ($$). Примечание: это медленнее, чем непрототированная подпрограмма.

+0

Решение mscha чище и, похоже, работает. Вы видите, что какая-то причина не использует его? –

+0

@ Давид: использование закрытия может быть более эффективным. Тем не менее, я не использовал бенчмарк. –

+2

Если производительность является соображением и функция сравнения тяжела, посмотрите на [преобразование Шварца] (http://en.wikipedia.org/wiki/Schwartzian_transform). – mscha

Смежные вопросы