考虑以下哈希:
my $hoh = {
'tag1' => {
'name' => 'Item 1',
'order' => '1',
'enabled' => '1',
},
'tag2' => {
'name' => 'Item 2',
'order' => '2',
'enabled' => '0',
},
'tag3' => {
'name' => 'Item 3',
'order' => '3',
'enabled' => '1',
},
}
我使用以下来获取哈希值:
for my $x (keys %{ $hoh{'tag1'} }) {
my $y = $hoh{'tag1'}{$x};
print "key is $x --- value is $y\n";
}
但是输出不是按键存储的顺序!是否可以确保键值对按照它们存储的顺序打印?
答案 0 :(得分:2)
没有存储密钥的“订单”。这是一个哈希。如果你真的想要一个特定的订单(对于表格标题等),那么请保留一个单独的列表。
my @table_headings = qw(name order enabled);
for my $k (@table_headings) {
my $v = $hoh->{tag1}->{$k};
print "$k => $v\n";
}
答案 1 :(得分:2)
Perl哈希不存储您用于定义哈希的顺序。您可以使用Tie::IxHash模块。
我看到你有哈希哈希,所以你应该为你正在使用的每个哈希使用Tie :: Hash(如果你想要以相同的顺序进行子哈希),不仅是$ hoh哈希,而且每个键的嵌套哈希值。
use Tie::IxHash;
my %hoh = ();
tie %hoh, 'Tie::IxHash';
$hoh{'tag1'} = Tie::IxHash->new('name'=>'Item 1', 'order'=>'1', 'enabled'=>'1');
#...
答案 2 :(得分:1)
你需要绑定哈希,因为普通哈希不以任何特定顺序存储它的密钥, http://perldoc.perl.org/functions/keys.html
use Tie::IxHash;
my $hoh = {};
tie %$hoh, 'Tie::IxHash';
%$hoh = (
'tag1' => {
'name' => 'Item 1',
'order' => '1',
'enabled' => '1',
},
'tag2' => {
'name' => 'Item 2',
'order' => '2',
'enabled' => '0',
},
'tag3' => {
'name' => 'Item 3',
'order' => '3',
'enabled' => '1',
},
);