arrays - paso - sintaxis de perl
¿Cómo ordenar los números en Perl? (6)
print "@_/n";
4109 4121 6823 12967 12971 14003 20186
¿Cómo lo clasifico en Perl?
Usando @sorted = sort(@_);
me da un orden alfabético
13041 13045 14003 20186 4109 4121 6823
¿Cómo obtengo un pedido numérico? ¿Tiene Perl funciones integradas para merge-sort, insertion-sort, etc.?
El sort
de Perl se ordena alfabéticamente en orden ASCII. Para ordenar numéricamente puede usar:
@sorted = sort { $a <=> $b } @_;
Esta es una pregunta frecuente de Perl. Desde la línea de comando:
perldoc -q sort
perlfaq4: ¿cómo puedo ordenar una matriz por (cualquier cosa)?
Puede predefinir la función que debería usarse para comparar valores en su matriz. perldoc -f sort
te da un ejemplo:
# sort using explicit subroutine name
sub byage {
$age{$a} <=> $age{$b}; # presuming numeric
}
@sortedclass = sort byage @class;
<=>
operador <=>
se usa para ordenar numéricamente.
@sorted = sort {$a <=> $b} @unsorted;
@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
Debe proporcionar su propia subrutina de clasificación { $a <=> $b }
Puede pasar una función de comparación personalizada a la rutina de ordenación de Perl. Solo usa:
@sorted = sort { $a <=> $b } @unsorted;
La función de sort
acepta una función de comparación personalizada como primer argumento, en forma de un bloque de código. La {...}
parte es solo este bloque de código (ver http://perldoc.perl.org/functions/sort.html ).
sort
llamará a esta función de comparación personalizada cada vez que necesite comparar dos elementos de la matriz que se va a ordenar. sort
siempre pasa los dos valores para comparar como $a
, $b
, y la función de comparación debe devolver el resultado de la comparación. En este caso, solo usa el operador para la comparación numérica (ver http://perldoc.perl.org/perlop.html#Equality-Operators ), que probablemente fue creado solo para este propósito :-).
Solución robada sin pudor de " Perl Cookbook ", Capítulo 04 Subcapítulo 15 (comprar el libro - ¡vale la pena!)
Proporcione una función de comparación para sort()
:
# sort numerically ascending
my @articles = sort {$a <=> $b} @files;
# sort numerically descending
my @articles = sort {$b <=> $a} @files;
La función de clasificación predeterminada es cmp
, string comparison, que ordenaría (1, 2, 10)
en (1, 10, 2)
. <=>
, utilizado anteriormente, es el operador de comparación numérica.