2010-06-08 13 views
9

Puedo usar IxHash para recordar el orden de inserción de un hash.¿Cómo puedo conservar el orden de inserción de un hash Perl anidado?

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 

¿Qué tal el hash anidado?

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

Sospecho que la respuesta no es como el q hash es anónimo y el orden se pierde antes de IxHash lo ve.

Sé que puedo hacer un empate en $ hash {q} y luego agregar los elementos, pero me gusta usar la única tarea para construir el hash.

¿Hay un truco?

Respuesta

11

Existen múltiples maneras de hacer esto, me acaba de concluir el empate en una subrutina de modo que es fácil de usar en línea:

use Tie::IxHash; 

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

y luego:

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

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

el prototipo (%) en la subrutina le dice a Perl que toma una lista con un número par de elementos

Cuestiones relacionadas