2013-05-31 36 views
3

考虑以下散列:是否可以按照密钥存储顺序在perl中进行迭代?

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

但产量并不在键保存订购!是否可以确定键值对是按照存储的顺序打印的?

回答

2

没有“秩序”,其中的密钥存储。这是一个散列。如果你真的想要一个特定的订单(表格标题等),然后保持一个单独的列表。

my @table_headings = qw(name order enabled); 
for my $k (@table_headings) { 
    my $v = $hoh->{tag1}->{$k}; 
    print "$k => $v\n"; 
} 
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', 
    }, 
); 
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'); 
#... 
相关问题