Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Orden numérico
@sorted = sort { $a <=> $b } @list;
La comparación de $a y $b con el operador <=> garantiza que se comparen numéricamente y no
textualmente como por defecto.
Orden inverso
@sorted = sort { $b <=> $a } @list;
@sorted = reverse sort { $a <=> $b } @list;
Clasificación de elementos en orden descendente, simplemente se puede lograr mediante el
canje $a y $b en el bloque comparador. Sin embargo, algunas personas prefieren la claridad de un
reverse separado aunque sea un poco más lento.
La transformada de Schwartzian
Este es probablemente el ejemplo más famoso de una optimización de ordenación que utiliza las
funciones de programación funcional de Perl, para usarse donde el orden de los elementos
depende de una función costosa.
# What you would usually do
@sorted = sort { slow($a) <=> slow($b) } @list;
# What you do to make it faster
@sorted =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, slow($_) ] }
@list;
El problema con el primer ejemplo es que el comparador se llama muy a menudo y sigue
recalculando los valores usando una función lenta una y otra vez. Un ejemplo típico sería ordenar
los nombres de los archivos por su tamaño de archivo:
use File::stat;
@sorted = sort { stat($a)->size <=> stat($b)->size } glob "*";
Esto funciona, pero en el mejor de los casos incurre en la sobrecarga de dos llamadas al sistema
por comparación, en el peor, tiene que ir al disco dos veces para cada comparación y ese disco
puede estar en un servidor de archivos sobrecargado en el otro lado del planeta.
Entra en el truco de Randall Schwartz.
La Transformación de Schwartz, básicamente, empuja @list través de tres funciones, de abajo
hacia arriba. El primer map convierte cada entrada en una lista de dos elementos del elemento
original y el resultado de la función lenta como una clave de ordenación, por lo que al final de esto
llamamos slow() exactamente una vez para cada elemento. La siguiente sort puede simplemente
https://riptutorial.com/es/home 22