15.03.2020 Views

perl-language-es

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!