2010-06-08 6 views
9

Posso usare IxHash per ricordare l'ordine di inserimento di un hash.Come posso mantenere l'ordine di inserimento di un hash Perl annidato?

use Tie::IxHash; 

my %hash; 
tie(%hash, 'Tie::IxHash'); 
%hash = (
    x => 10, 
    z => 20, 
    q => { a1 => 1, a3 => 5, a2=>2,}, 
    y => 30, 
); 

printf("keys %s\n", join(" ", keys %hash)); 

=> keys x z q y 

E l'hash annidato?

printf("keys %s\n", join(" ", keys %{$hash{q}})); 
keys a2 a1 a3 

ho il sospetto che la risposta è no, come l'hash q è anonimo e l'ordine viene perso prima IxHash vede.

So che posso eseguire Tie su $ hash {q} e quindi aggiungere gli elementi, ma mi piace usare il singolo compito per creare l'hash.

C'è un trucco?

risposta

11

Ci sono diversi modi per fare questo, vorrei solo concludere la cravatta in una subroutine in modo che la sua facile da usare inline:

use Tie::IxHash; 

sub ordered_hash (%) { 
    tie my %hash => 'Tie::IxHash'; 
    %hash = @_; 
    \%hash 
} 

e poi:

tie my %hash => 'Tie::IxHash'; 

%hash = (
    x => 10, 
    z => 20, 
    q => ordered_hash(a1 => 1, a3 => 5, a2=>2), 
    y => 30, 
); 

il (%) prototipo sulla subroutine dice a perl che prende una lista con un numero pari di elementi

Problemi correlati