如何保留嵌套Perl哈希的插入顺序?

时间:2010-06-08 21:06:06

标签: perl

我可以使用IxHash来记住哈希的插入顺序。

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}上绑定然后添加元素,但我喜欢使用单一赋值来构建哈希。

有诀窍吗?

1 个答案:

答案 0 :(得分: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它需要一个包含偶数个元素的列表