3

考虑以下哈希:

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

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

4

3 回答 3

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');
#...
于 2013-05-31T06:17:08.283 回答
2

存储密钥没有“顺序”。这是一个哈希。如果您真的想要一个特定的顺序(用于表格标题等),请保留一个单独的列表。

my @table_headings = qw(name order enabled);
for my $k (@table_headings) {
    my $v = $hoh->{tag1}->{$k};
    print "$k => $v\n";
}
于 2013-05-31T06:16:34.043 回答
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',
  },
);
于 2013-05-31T06:16:00.887 回答