-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[59] Come si ordina un hash (opzionalmente per valore invece che per chiave)?

(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;

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google