是否可以按照密钥的存储顺序对perl中的散列进行迭代?

时间:2013-05-31 06:12:42

标签: perl sorting hash

考虑以下哈希:

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";
            }

但是输出不是按键存储的顺序!是否可以确保键值对按照它们存储的顺序打印?

3 个答案:

答案 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',
  },
);