Fornite una funzione di confronto a sort() (descritta in perlfunc/sort):
@lista = sort { $a <=> $b } @lista;
La funzione di ordinamento predefinita è cmp, confronto tra
stringhe, che ordinerebbe (1, 2, 10) in (1, 10, 2). <=>,
utilizzato sopra, è l'operatore di confronto numerico.
Se avete bisogno di una funzione complessa che estragga la parte su cui
desiderate basare l'ordinamento, non scrivetela all'inerno della funzione
di ordinamento. Estraete tale parte prima, poiché il BLOCCO di
ordinamento può essere chiamato molte volte per lo stesso
elemento. Ecco un esempio di come estrarre la prima parola dopo il primo
numero da ciascun elemento, e poi ordinare tali parole senza distinguere
lettere maiuscole da lettere minuscole.
@indice = ();
for (@dati) {
($chiave) = /\d+\s*(\S+)/;
push @indice, uc($chiave);
}
@ordinati = @dati[ sort { $indice[$a] cmp $indice[$b] } 0 .. $#indice ];
che potrebbe anche essere scritto come segue, utilizzando un trucco
diventato noto come la Trasformata di Schwartz:
@ordinati = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @dati;
Se avete bisogno di basare l'ordinamento su svariati campi, è
utile il seguente paradigma.
@ordinati = sort { campo1($a) <=> campo1($b) ||
campo2($a) cmp campo2($b) ||
campo3($a) cmp campo3($b)
} @data;
Questo può essere convenientemente combinato con il calcolo
preventivo delle chiavi, come descritto sopra.
Per ulteriori informazioni su questo approccio, consultate l'articolo
sort nella collezione "Far More Than You Ever Wanted To Know"
["Molto più di quanto avreste mai voluto sapere", NdT]
all'indirizzo http://www.cpan.org/olddoc/FMTEYEWTK.tgz [in
inglese, NdT].
Consultate anche la domanda sull'ordinamento degli hash, riportata sotto.
|