Newsgroup: it.comp.lang.perl
Titolo: hash ordinate?

Ciao,
(premessa, avevo studiato Perl nel 94. Poi l'ho ripreso in mano di tanto in
tanto negli anni, ma i reference di Perl 5 hanno lasciato un casino totale nella
mia testa. Per� rimane un linguaggio potentissimo, specie ora che ho bisogno di
farmi delle utility a mio uso e consumo. Quindi...non demordo).
Avrei bisogno di Hash ordinate, In questo senso. Parso un file e catturo gli
elementi.
Vorrei che quando vado in loop sulle keys dell'hash, queste mi fossero
restituite nello stesso ordine in cui erano state trovate nel file originario.
Il modo quick&dirty per farlo � avere due strutture: un Array con le keys e una
Hash, almeno vado in loop sull'array per ritrovari le keys nell'ordine giusto.
Per� mi sembra una soluzione accroccata e poco elegante....
Suggerimenti?
Grazie
Luca

 Suggerimenti?
Basta usare Tie::IxHash, che preserva l'ordine di inserimento degli 
elementi nell'hash, proprio come serve a te:
use strict;
use warnings;
use Tie::IxHash;
tie my %hash, 'Tie::IxHash';
%hash = (
    1 => 'primo'  ,
    2 => 'secondo',
    3 => 'terzo'  ,
    4 => 'quarto'
);
while ( my ($chiave, $valore) = each %hash ) {
    print $chiave, ' -> ', $valore, "\n"
}
# 1 -> primo
# 2 -> secondo
# 3 -> terzo
# 4 -> quarto
http://search.cpan.org/~chorny/Tie-IxHash-1.22/lib/Tie/IxHash.pm
Se posso darti un consiglio, prima di iniziare un progetto (od anche un 
semplice esercizio), cerca sempre su CPAN, ché quasi certamente troverai 
quello che ti serve già bello e pronto:
http://search.cpan.org/recent
Tra le tante risorse, non dimenticare poi Perl.it:
http://www.perl.it
P.S.
Per qualsiasi eventuale problema con i reference, facci sapere ;-)
Ciao e bentornato!

 Per qualsiasi eventuale problema con i reference, facci sapere ;-)
grazie dell'ospitalità Emanuele e grazie della risposta.
Una cosa che mi devo essere perso è come fa perl a definire funzioni che
sembrano keywords nuove (es: "tie" nel tuo esempio). Ma non gli si impantana il
parser? e non c'è il rischio che un punto e virgola dimenticato alla linea n,
diventi un errore senza senso alla linea n+30 ?
A proposito, tutti i moduli funzionano anche su windows?
Ho questa versione installata:
C:\>perl -v
This is perl, v5.10.0 built for MSWin32-x86-multi-thread
(with 5 registered patches, see perl -V for more detail)
Copyright 1987-2007, Larry Wall
Binary build 1004 [287188] provided by ActiveState 
http://www.ActiveState.com
Built Sep  3 2008 13:16:37
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at 
http://www.perl.org/
, the Perl Home Page.
Grazie
Luca

 Ho questa versione installata:
Disinstalla tutto (e cancella anche il settaggio del PATH) e installa 
invece questa:
http://strawberryperl.com/
Ti installa l'impossibile (via cpan).
Altrimenti se vuoi rimanere con ActivePerl (che dovresti comunque 
aggiornare), usa i ppm precompilati anziché cpan:
http://trouchelle.com/perl/ppmrepview.pl
(ma ci sono anche altri repository).
Ciao!

              keys %hash);
Magari, meglio, visto che ci abbiamo messo un valore numerico:
 for my $key (sort {
                     $hash{$a}->[1] <=> $hash{$b}->[1]
                   }
              keys %hash);
Ciao.

 Ciao.