2010-06-08 7 views
9

Je peux utiliser IxHash pour mémoriser l'ordre d'insertion d'un hachage.Comment puis-je conserver l'ordre d'insertion d'un hachage Perl imbriqué?

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 

Que diriez-vous du hachage imbriqué?

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

Je soupçonne que la réponse est non comme le hachage q est anonyme et l'ordre est perdu avant IxHash voit. Je sais que je peux faire Tie sur $ hash {q} et ensuite ajouter les éléments, mais j'aime utiliser l'affectation unique pour construire le hachage.

Y at-il un truc?

Répondre

11

Il y a plusieurs façons de le faire, je voudrais juste envelopper la cravate dans un sous-programme de sorte que son facile à utiliser en ligne:

use Tie::IxHash; 

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

puis:

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

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

le prototype (%) sur le sous-programme dit à perl qu'il prend une liste avec un nombre pair d'éléments

Questions connexes