2013-02-23 124 views
3

循環我有陣列的散列,如下所示:通過陣列的散列在Perl

my %hash = (
234 => ["Larry", "Curly", "Moe"], 
235 => ["bb", "ab", "aa", "ab", "bb"], 
236 => ["aa", "ab", "bb", "aa", "bb"], 
) 

對於我的散列每個鍵,我想通過陣列的每個元素環,賦值給一個標量變量,以便我可以處理它,然後移動到數組的下一個元素。一旦我已處理的陣列的密鑰的所有元素,我要到下一個鍵和單獨地處理所有其數組的元素的,依此類推。

我發現,改性的代碼片段在散列值迭代(每個鍵的在這種情況下,數組)。然後我有一個嵌套的for循環,遍歷該數組的每個元素。但是,這並沒有達到我期望的水平。

for my $value (values %hash) { 
    for (@$value) { 
     my $index = shift($_); 
     #process index 
    } 
} 

錯誤消息 未在[行號]

例如數組引用,對於第一次迭代,我想$index等於Larry這樣我可以處理它。下一次迭代,我想$index平等Curly,這樣我可以處理它。下一次迭代,$index應該等於Moe,對其進行處理。下一次迭代,$index應等於bb,等等。

有可能比shift更好的功能。 shift函數將第一個元素從數組中取出。我希望數組散列保留其值,以便我不必重新填充數組的散列。

感謝

回答

9

的問題是,您在@$value名單已經是你的數組元素,而不是陣列的列表。這就是爲什麼你不能使用它shift。所有你需要的是:

for my $value (values %hash) { 
    for my $index (@$value) { # "Larry", "Curly", "Moe" etc 
     .... 
     #process index 
    } 
} 

你可能不希望您的陣列上使用shift無論如何,因爲這會從您的原始結構刪除條目。

1

如果你想通過數組的散列循環,可以做一些這樣的事

#!/usrbin/perl -w 
use strict; 
use warnings; 
use Data::Dumper; 


my %hash = (
234 => ["Larry", "Curly", "Moe"], 
235 => ["bb", "ab", "aa", "ab", "bb"], 
236 => ["aa", "ab", "bb", "aa", "bb"], 
); 

foreach (keys %hash){ 
    foreach my $array(@{$hash{$_}}){ 
     ##do something with $array; 
    } 
} 

這裏$陣列將用於存放數組值一次一個特定鍵。

謝謝