2010-06-08 3 views
9

Ich kann IxHash verwenden, um die Einfügereihenfolge eines Hash zu erinnern.Wie kann ich die Reihenfolge der Insertion eines verschachtelten Perl-Hashes beibehalten?

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 

Wie wäre es mit dem verschachtelten Hash?

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

Ich vermute, die Antwort ist nein, da der q-Hash anonym ist und die Reihenfolge ist verloren, bevor IxHash es sieht.

Ich weiß, dass ich Tie auf $ Hash {q} tun kann und dann die Elemente hinzufügen, aber ich mag die Verwendung der einzelnen Zuordnung, um den Hash zu erstellen.

Gibt es einen Trick?

Antwort

11

Es gibt mehrere Möglichkeiten, dies zu tun, ich würde nur die Krawatte in einem Unterprogramm einpacken, so dass ihre leicht inline verwenden:

use Tie::IxHash; 

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

und dann:

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

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

der (%) Prototyp im Unterprogramm sagt Perl, dass es eine Liste mit einer geraden Anzahl von Elementen

dauert
Verwandte Themen