Могу ли я передать аргументы в подпрограмму сравнения вида в Perl? - PullRequest
8 голосов
/ 22 октября 2010

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

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
}

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

Ответы [ 2 ]

13 голосов
/ 22 октября 2010

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

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

my @sorted = sort { special_compare($a, $b, @more) } @list;
4 голосов
/ 22 октября 2010

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

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

my @sorted = sort $sub @list;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...