Я ответил на два других абсолютно одинаковых вопроса этого пользователя, но похоже, что этот победит, поэтому я отвечаю и здесь.
Из ответа perlfaq4 на Как отсортировать массив по чему-либо ?
Предоставить функцию сравнения для sort () (описана в sort в 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 о сортировке хэшей.