在Perl中,是否可以按照键存储的顺序迭代哈希表?

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

但输出的结果并非按照键值存储的顺序!有可能让键值对按照存储顺序进行打印吗?

3个回答

2

键没有特定的存储顺序,它是一个哈希表。如果你真的需要特定的顺序(例如表头等),那么请保持一个单独的列表。

my @table_headings = qw(name order enabled);
for my $k (@table_headings) {
    my $v = $hoh->{tag1}->{$k};
    print "$k => $v\n";
}

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');
#...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接