2013-05-31 78 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'); 
#... 
相關問題