Как сортировать числа в Perl?
print "@_\n";
4109 4121 6823 12967 12971 14003 20186
Как мне сортировать его в Perl?
Использование @sorted = sort(@_);
дает мне алфавитное упорядочение
13041 13045 14003 20186 4109 4121 6823
Как получить числовое упорядочение? Имеет ли Perl встроенные функции для сортировки слияния, вставки-сортировки и т.д.?
Ответы
Ответ 1
Вы можете передать пользовательскую функцию сравнения в процедуру сортировки 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 (купи книгу - это того стоит!)
Ответ 2
Поставьте функцию сравнения в 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)
. <=>
, используемый выше, является оператором численного сравнения.
Ответ 3
Perl sort
по умолчанию сортируется по алфавиту в порядке ASCII. Для сортировки численно вы можете использовать:
@sorted = sort { $a <=> $b } @_;
Ответ 4
@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 }
Ответ 5
Это FAQ для Perl. Из командной строки:
perldoc -q sort
perlfaq4: Как отсортировать массив с помощью (ничего)?
Ответ 6
Вы можете предопределить функцию, которая должна использоваться для сравнения значений в вашем массиве.
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;
Ответ 7
Я просто хочу сэкономить много времени для любого, нового в Perl (например, я), у которого есть этот вопрос, то есть, как сортировать числовой массив, потому что я не только потерял время, но и сбил меня с ума!
Итак, вы найдете здесь (и во многих других местах), что способ сортировки числового массива:
@sorted_array = sort { $a <=> $b } @unsorted_array;
Теперь вы попробуете, и вы получите сообщение об ошибке: "Невозможно использовать" my $a "в сортировке"! (Это потому, что вы уже объявили "$ a", используя "strict.pm" ). Но тогда вы не можете использовать не объявленные переменные, так как они будут отклонены как undefined! Таким образом, вы можете чувствовать себя в тупике, как я.
Мне пришлось решить эту проблему "трудным путем", потому что никто не заботился - ни здесь, ни в perldoc.perl.org, ни в другом месте, которое я посетил, - чтобы упомянуть, что "$ a 'AND' $b 'RESERVED (TOKENS) ДЛЯ ЭТОГО ИСПОЛЬЗОВАНИЯ! (Это, конечно, когда вы используете" строгую ", что нужно. И это довольно сумасшествие, потому что" a "и" b" относятся к числу наиболее распространенных коротких переменных, используемых в программировании, и логически так!)
Я надеюсь, что это поможет многим программистам, новым в Perl, которые будут посещать эту страницу!