Я ответил на двух других точно такие же вопросы этого пользователя, но, похоже, это один будет чтобы выиграть, поэтому я тоже здесь отвечаю.
От perlfaq4 ответ на вопрос How do I sort an array by anything?
Поставка функция сравнения для сортировки() (описано в рода в perlfunc):
@list = sort { $a <=> $b } @list;
Функция сортировки по умолчанию является CMP, сравнение строк, которые будут сортировать (1, 2, 10) в (1, 10, 2). < =>, используемый выше, является оператором численного сравнения.
Если у вас есть сложная функция, необходимая для вытягивания части, которую вы хотите отсортировать, тогда не делайте этого внутри функции сортировки. Сначала вытащите его, потому что сортировку BLOCK можно вызвать много раз для одного и того же элемента. Вот пример того, как вытащить первое слово после первого номера на каждый элемент, а затем отсортировать эти слова без учета регистра.
@idx =();
for (@data) {
($item) = /\d+\s*(\S+)/;
push @idx, uc($item);
}
@sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];
, которые также могут быть написаны таким образом, используя трюк, который пришел, чтобы быть известным как преобразование Шварца:
@sorted = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [ $_, uc((/\d+\s*(\S+)/)[0]) ] } @data;
Если необходимо отсортировать по нескольким полям, следующая парадигма является полезным.
@sorted = sort {
field1($a) <=> field1($b) ||
field2($a) cmp field2($b) ||
field3($a) cmp field3($b)
} @data;
Это удобно сочетать с предварительным расчетом ключей, как указано выше.
Подробнее об этом подходе см. В статье «Больше, чем вы когда-либо хотели знать» в http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz.
См. Также вопрос позже в perlfaq4 по сортировке хешей.
'использовать строги' - пожалуйста! –