2010-08-26 17 views
19
print "@_\n"; 
4109 4121 6823 12967 12971 14003 20186 

¿Cómo lo ordeno en Perl?¿Cómo ordenar números en Perl?

Usando @sorted = sort(@_); me da una alfabético ordenar

13041 13045 14003 20186 4109 4121 6823 

¿Cómo consigo una ordenación numérica? ¿Tiene Perl funciones integradas para merge-sort, insertion-sort, etc.?

+0

BTW, ¿conoce usted el comando perldoc? –

+0

@eugene y: no, no lo hice. Lo se ahora. ¡Gracias! – Lazer

Respuesta

42

Puede pasar una función de comparación personalizada a la rutina de ordenación de Perl. Sólo tiene que utilizar:

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

La función 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 en 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 robado descaradamente de "Perl Cookbook", Capítulo 04 Sub-capítulo 15 (comprar el libro - que vale la pena)

+1

Quitaría ese enlace, está distribuyendo material protegido por derechos de autor sin el consentimiento del titular. En su lugar, podría recomendar el trabajo original (Perl Cookbook, Christiansen y Torkington). –

+0

Parece ser un consenso sobre la etiqueta [Perl] que la vinculación a copias pirateadas de libros O'Reilly (o cualquier libro) es mala. Editando para eliminar – DVK

+0

Lo sentimos, no nos dimos cuenta de que el enlace era de material pirateado. Gracias por arreglarlo. – sleske

2

Puede predefinir la función que debe usarse para comparar valores en su matriz. perldoc -f sort le da un ejemplo:

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

<=> operador se utiliza para ordenar numéricamente.

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

de sort por tipo por defecto alfabéticamente en orden ASCII Perl. Para ordenar numéricamente puede utilizar:

@sorted = sort { $a <=> $b } @_; 
+0

¿Cómo funciona esto? – Lazer

+0

@Lazer: vea mis explicaciones (presenté la misma respuesta, solo un poco después ;-)). – sleske

8

de alimentación a una función de comparación 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 por defecto es cmp, la comparación de cadenas, que lo solucionaría (1, 2, 10) en (1, 10, 2). <=>, utilizado anteriormente, es el operador de comparación numérica.

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 

Usted tiene que proporcionar su propia clasificación subrutina { $a <=> $b }

0

sólo quiero ahorrar mucho tiempo para nadie, nuevo en Perl (como yo) que tiene esta cuestión, es decir, cómo ordenar una matriz numérica, porque ¡No solo he perdido el tiempo sino que me ha vuelto loco!

lo tanto, usted encontrará aquí (y en muchos otros lugares) que la manera de ordenar una matriz numérica es:

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

Ahora que lo pruebe, y se obtiene un error: "No se puede usa "mi $ a" en la comparación de clasificación "! (Esto se debe a que ya ha declarado '$ a', usando 'strict.pm'). ¡Pero tampoco puede usar variables no declaradas, ya que serán rechazadas como indefinidas! Entonces, podrías sentirte atrapado en un callejón sin salida, como yo lo hice.

Tuve que resolver este problema "de la manera difícil", simplemente porque a nadie le ha importado, ya sea aquí, o en perldoc.perl.org, o en cualquier otro lugar que he visitado, mencionar que '$ ¡'AND' $ b 'ESTÁN RESERVADOS (TOKENS) PARA ESTE USO! (Esto por supuesto cuando uno usa 'estricto', cuál debería. Y que es bastante loco, porque 'a' y 'b' están entre las variables cortas más comunes usadas en programación, y lógicamente así!)

I Espero que esto ayude a muchos programadores, nuevos en Perl, ¡que visitarán esta página!

Cuestiones relacionadas