Da perlfaq4, la risposta a "http://faq.perl.org/perlfaq4.html#How_do_I_sort_a_hash" ha la maggior parte delle informazioni necessarie per mettere insieme il vostro codice.
Si potrebbe anche voler vedere il capitolo su Ordinamento in Learning Perl.
Chris ha una risposta completa, anche se odio usare values
in questo modo. Un modo più familiare per fare la stessa cosa è di passare attraverso le chiavi di hash di livello superiore, ma ordina per la chiave di secondo livello:
my @sorted_hashes =
sort { $hash2->{$a}{count} <=> $hash2->{$b}{count} }
keys %hash2;
lo faccio in questo modo perché è un po 'meno mind-bending .
Come si ordina un hash (facoltativamente in base al valore anziché al tasto)?
(contributo di brian d foy)
Per ordinare un hash, iniziamo con le chiavi. In questo esempio, forniamo l'elenco delle chiavi alla funzione di ordinamento che quindi le confronta in modo ASCII (che potrebbe essere influenzato dalle impostazioni locali). L'elenco di output ha le chiavi in ordine ASCIIbetic. Una volta che abbiamo le chiavi, possiamo esaminarle per creare un rapporto che elenca le chiavi in ordine ASCIIbetico.
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key (@keys)
{
printf "%-20s %6d\n", $key, $hash{$key};
}
Tuttavia, nel blocco sort() si potrebbe ottenere di più. Invece di confrontare le chiavi, possiamo calcolare un valore con esse e usare quel valore come confronto.
Ad esempio, per rendere il nostro rapporto senza distinzione tra maiuscole e minuscole, si utilizza la sequenza \ L in una stringa con doppia virgoletta per rendere tutto in minuscolo. Il blocco sort() confronta quindi i valori minuscoli per determinare in quale ordine inserire le chiavi.
my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
Nota: se il calcolo è costoso o l'hash ha molti elementi, si consiglia di guardare il Trasformata di Schwartz di memorizzare nella cache i risultati del calcolo.
Se invece vogliamo ordinare per valore hash, usiamo il tasto hash per cercarlo. Abbiamo ancora una lista di chiavi, ma questa volta sono ordinate in base al loro valore.
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
Da lì possiamo diventare più complessi. Se i valori hash sono gli stessi, possiamo fornire un ordinamento secondario sulla chiave hash.
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
Vuoi dire che si vuole ottenere l'elenco di hash (come hash1) scelte per il conteggio dei valori in hash2? – Jagmal
sì Jagmal significa che voglio ordinare rispetto a $ hash2 {"asd"} {count}. – systemsfault