Newsgroup: it.comp.lang.perl
Titolo: Ordinamento di un hash

Ciao a tutti...
non riesco ad ordinare le chiavi di un hash in ordine alfabetico...
ho provato con la funzione sort...ma ottengo un hash con un ordine
diverso ma non ordinato alfabeticamente!!
Cosa non ho fatto??? o cosa sbagliato?
Ivan



L'argomento è stato + voltre trattato nel gruppo. Ecco un post interessante:
http://usenet.libero.it/cgi-bin/ViewArticle.epl?MESSAGE_ID=%3C20030328131036%2E3f6b4fcd%2Elarsen%40libero%2Eit%3E&TABLES=RECENT_MSG&GRUPPO=it%2Ecomp%2Elang%2Eperl&CATEG_PARAM=Computer%20e%20Internet&SOTTOCATEG_PARAM=Linguaggi%20di%20programmazione
by
	- Enrico

 diverso ma non ordinato alfabeticamente!!
Non mi e` chiaro in che senso hai "provato con la funzione sort".
Un hash non e` una struttura dati che preserva l'ordine di inserimento
dei valori [1]. E` come un sacchetto in cui si buttano alla rinfusa
coppie chiave-valore. Cio` non vuol dire che non puoi ottenere
questi elementi mettendoli nell'ordine che vuoi tu. Ecco un piccolissimo
esempio che stampa le coppie chiave-valore contenute in %h, in ordine
di chiave:
   foreach my $k ( sort keys %h ) {
       print "Alla chiave $k corrisponde il valore $h{ $k }\n";
   }
ciao
Stefano
[1] Un giorno un tale mi ha detto che "Non si puo`" non si puo`
     dire in Perl. Se pensi comunque che ti serva una struttura
     dati che si comporta come un hash ma che preserva l'ordine
     di inserimento, allora hai due possibilita`:
     i. memorizzare in un array le chiavi mano a mano che le
        inserisci nella hash, come in questo esempio:
        push @chiavi, $k;
        $h{ $k } = $valore;
        ma poi credo siano dolori mantenere consistenti le due
        cose.
    ii. Usare il modulo Tie::IxHash
 
http://search.cpan.org/author/GSAR/Tie-IxHash-1.21/


grazie...
questa sort mi funziona solo se ho delle stringhe letterali....
se come chiave io ho un numero...non mi ordina le chiavi...
me le da in ordine sparso.... Io posso avere sia chiavi letterali che
numeriche
che miste.....
es: se ho le chiavi "100" "150" "aaaa" "gggg" "10" "cccc"
mi aspetterei dopo la sort...le chiavi ordinate:
10
100
150
aaaa
cccc
gggg
???? invece a me capita che le chiavi numeriche siano in ordine
sparso..quelle letterali
invece sono correttamente in ordine alfabetico!
Come posso fare?????


Ci dovrebbe essere un modulo su CPAN chiamato Naturally.pm
Dacci un occhio, forse fa al caso tuo.
Ciao Seva

 invece sono correttamente in ordine alfabetico!
Di default sort() ordina lessicograficamente la lista che gli passi.
In altri termini:
   sort keys %hash
equivale a
   sort { $a cmp $b } keys %hash;
Se vuoi un ordinamento numerico, usa l'operatore <=>, come in questo
esempio:
   sort { $a <=> $b } keys %hash;
ciao
Stefano

gggg
Da me ("This is perl, v5.8.0 built for MSWin32-x86-multi-thread... Binary
build 805 provided by ActiveState Corp.") è esattamente quello che succede.
E' chiaro che i numeri sono ordinati alfabeticamente ("100" viene prima di
"20"), ma non sono "in ordine sparso".
Se invece vuoi che i numeri siano ordinati numericamente e le stringhe
alfabeticamente, o comunque che l'ordinamento segua un criterio diverso da
quello standard, devi fornire un blocco o una sub di comparazione alla
funzione sort (perldoc -q sort, perldoc -f sort), o usare una funzione di
sort ad hoc.
Quella fornita dal modulo Sort::Naturally citato fa un lavoro piuttosto
complesso. Credo che vada bene per quello che devi fare, ma probabilmente
potrebbe bastare anche molto meno.
Ciao.

 wrote in message
news:_dSka.78469$Jg1.1...@news1.tin.it...

ma io necessiterei di un misto delle due opzioni che tu mi indichi...
poichè ho l'esigenza di ordinare un le chiavi di un hash che sono sia
numeriche che letterali.....