Подтвердить что ты не робот

Как сортировать числа в Perl?

print "@_\n";
4109 4121 6823 12967 12971 14003 20186

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

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

13041 13045 14003 20186 4109 4121 6823

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

4b9b3361

Ответ 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 }

Ответ 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, которые будут посещать эту страницу!