2010-06-08 87 views
9

我可以使用IxHash来记住哈希的插入顺序。如何保留嵌套Perl哈希的插入顺序?

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 

嵌套散列?

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

我怀疑答案是否定的,因为q散列是匿名的,并且在IxHash看到它之前命令丢失。

我知道我可以在$ hash {q}上执行Tie并添加元素,但我喜欢使用单个赋值来构建哈希。

有没有一招?

回答

11

有多种方法可以做到这一点,我只想包领带的子程序,使其易于使用的在线:

use Tie::IxHash; 

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

然后:

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

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

(%)原型子例程告诉perl它需要一个包含偶数个元素的列表