Как отсортировать числа в Perl? - PullRequest
24 голосов
/ 26 августа 2010
print "@_\n";
4109 4121 6823 12967 12971 14003 20186

Как мне отсортировать его в Perl?

Использование @sorted = sort(@_); дает мне алфавитный порядок

13041 13045 14003 20186 4109 4121 6823

Как мне получить числовой порядок? Есть ли в Perl встроенные функции для сортировки слиянием, сортировки вставкой и т. Д.?

Ответы [ 7 ]

48 голосов
/ 26 августа 2010

Вы можете передать пользовательскую функцию сравнения в процедуру сортировки Perl. Просто используйте:

@sorted = sort { $a <=> $b } @unsorted;

Функция sort принимает пользовательскую функцию сравнения в качестве первого аргумента в виде блока кода. Часть {...} является именно этим блоком кода (см. http://perldoc.perl.org/functions/sort.html).

sort будет вызывать эту пользовательскую функцию сравнения всякий раз, когда ей нужно сравнить два элемента из массива, который будет отсортирован. sort всегда передает два значения для сравнения как $a, $b, и функция сравнения должна возвращать результат сравнения. В этом случае он просто использует оператор для числового сравнения (см. http://perldoc.perl.org/perlop.html#Equality-Operators), который, вероятно, был создан именно для этой цели: -).

Решение бессовестно похищено из " Perl Cookbook ", глава 04, подзаголовок 15 (купите книгу - оно того стоит!)

9 голосов
/ 26 августа 2010

Предоставить функцию сравнения для sort():

# sort numerically ascending
my @articles = sort {$a <=> $b} @files;

# sort numerically descending
my @articles = sort {$b <=> $a} @files;

По умолчанию используется функция сортировки cmp, сравнение строк, которая сортирует (1, 2, 10) в (1, 10, 2).<=>, использованный выше, является оператором числового сравнения.

8 голосов
/ 26 августа 2010

Perl's sort по умолчанию сортирует по алфавиту в порядке ASCII. Для численной сортировки вы можете использовать:

@sorted = sort { $a <=> $b } @_;
6 голосов
/ 26 августа 2010

Это FAQ по Perl.Из командной строки:

perldoc -q sort

perlfaq4: как отсортировать массив по (чему угодно)?

5 голосов
/ 26 августа 2010
@l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4);
@l = sort { $a <=> $b } @l;
print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186

Вы должны предоставить собственную подпрограмму сортировки { $a <=> $b }

2 голосов
/ 26 августа 2010

Вы можете предопределить функцию, которая должна использоваться для сравнения значений в вашем массиве. perldoc -f sort дает вам пример:

# sort using explicit subroutine name
sub byage {
   $age{$a} <=> $age{$b};  # presuming numeric
}
@sortedclass = sort byage @class;

<=> оператор используется для числовой сортировки.

@sorted = sort {$a <=> $b} @unsorted;
0 голосов
/ 26 декабря 2017

Я просто хочу сэкономить много времени любому, новичку в Perl (как и я), у которого есть этот вопрос, то есть, как сортировать числовой массив, потому что я не только потерял время, но и сводил меня с ума!

Итак, вы обнаружите здесь (и во многих других местах), что способ сортировки числового массива:

@sorted_array = sort { $a <=> $b } @unsorted_array;

Теперь вы попробуете это, и вы получите ошибку: "Не могу использовать "мой $ a" в сравнении сортировки "!(Это потому, что вы уже объявили '$ a', используя 'strict.pm').Но тогда вы также не можете использовать необъявленные переменные, так как они будут отклонены как неопределенные!Таким образом, вы можете почувствовать себя в тупике, как и я.

Мне пришлось решить эту проблему "трудным путем", просто потому, что никто не позаботился - ни здесь, ни на perldoc.perl.org, ни в каком-либо другом месте, которое я посетил - упомянуть, что'$ a' И '$ b' ЗАБРОНИРОВАНЫ (ТОКЕНЫ) ДЛЯ ЭТОГО ИСПОЛЬЗОВАНИЯ!(Это, конечно, когда кто-то использует «строгий», что и следует. И это довольно безумно, потому что «а» и «b» являются одними из самых распространенных коротких переменных, используемых в программировании, и логически так!)* Я надеюсь, что это поможет многим программистам, новичкам в Perl, которые посетят эту страницу!

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