(contributo di brian d foy)
Per ordinare un hash, partite dalle chiavi. In questo esempio forniamo la
lista delle chiavi alla funzione che le ordina, che le compara
ASCIIbeticalmente (questo potrebbe essere influenzato dalle vostre impostazioni
del locale). La lista in output ha le chiavi in ordine ASCIIbetico. Una volta che
avete le chiavi, le si potrebbe esaminare per creare un resoconto che faccia un
elenco delle chiavi in ordine ASCIIbetico.
my @chiavi = sort { $a cmp $b } keys %hash;
foreach my $chiave ( @chiavi )
{
printf "%-20s %6d\n", $chiave, $hash{$chiave};
}
Tuttavia, potremmo avere un blocco sort() più stravagante. Invece
di fare un confronto delle chiavi, con queste si può calcolare un valore
ed usarlo come confronto.
Per esempio, per rendere il nostro resoconto non dipendente dalle maiuscole/minuscole,
in una stringa racchiusa tra virgolette doppie si usa la sequenza \L per rendere
tutto minuscolo. Il blocco sort() dunque fa il confronto dei valori
resi minuscoli per determinare in quale ordine mettere le chiavi.
my @chiavi = sort { "\L$a" cmp "\L$b" } keys %hash;
Nota: se il calcolo è dispendioso oppure l'hash ha molti elementi,
potreste voler dare un'occhiata alla Schwartzian Transform [Trasformata di
Schwartz, NdT] per mettere in cache i risultati del calcolo.
Se invece si vuole ordinare per valore dell'hash, si usa la chiave
dell'hash per recuperare il valore. Si ottiene ancora una lista di chiavi,
ma stavolta sono ordinate per il loro valore.
my @chiavi = sort { $hash{$a} <=> $hash{$b} } keys %hash;
Da qui si possono ottenere cose più complesse. Se i valori dell'hash
sono gli stessi, si può fornire un ordinamento secondario sulla
chiave dell'hash.
my @chiavi = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
|