我可以使用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
Run Code Online (Sandbox Code Playgroud)
嵌套哈希怎么样?
printf("keys %s\n", join(" ", keys %{$hash{q}}));
keys a2 a1 a3
Run Code Online (Sandbox Code Playgroud)
我怀疑答案是否定的,因为q哈希是匿名的,并且在IxHash看到之前订单丢失了.
我知道我可以在$ hash {q}上进行绑定,然后添加元素,但我喜欢使用单一赋值来构建哈希.
有诀窍吗?
Eri*_*rom 11
有多种方法可以做到这一点,我只是将一个领带包装在一个子程序中,以便它易于使用内联:
use Tie::IxHash;
sub ordered_hash (%) {
tie my %hash => 'Tie::IxHash';
%hash = @_;
\%hash
}
Run Code Online (Sandbox Code Playgroud)
然后:
tie my %hash => 'Tie::IxHash';
%hash = (
x => 10,
z => 20,
q => ordered_hash( a1 => 1, a3 => 5, a2=>2 ),
y => 30,
);
Run Code Online (Sandbox Code Playgroud)
(%)子例程上的原型告诉perl它需要一个包含偶数个元素的列表