2016-10-01 61 views
3

這是很容易遍歷一個列表:Perl:是否可以遍歷匿名散列?

foreach my $elem (1, 2, 3, 4, 5) { 
    say $elem; 
} 

或匿名數組:

foreach my $elem (@{[ 1, 2, 3, 4, 5 ]}) { 
    say $elem; 
} 

但有可能做同樣的一個匿名的哈希?我試過:

while (my ($key, $value) = each (%{{ a => 1, b => 2, c => 3 }})) { 
    say "$key=$value"; 
} 

但我得到一個無限循環。

+4

與你所說的相反,沒有數組涉及'foreach my $ elem(1,2,3,4,5){elect; }' – ikegami

回答

12

foreach循環評估其表達式一次。另一方面,每一次通過一次就評估其表達。這意味着你不斷創建一個新的散列並抓住它的第一個元素。

你可以做到以下幾點:

use List::Util 1.29 qw(pairs); 

for my $pair (pairs %{ { a => 1, b => 2, c => 3 } }) { 
    my ($key, $val) = @$pair; 
    ... 
} 

但就像你的第二個片段是你的第一個片段的不必要的浪費和複雜的版本,上面是下面的不必要的浪費和複雜的版本:

use List::Util 1.29 qw(pairs); 

for my $pair (pairs a => 1, b => 2, c => 3) { 
    my ($key, $val) = @$pair; 
    ... 
} 
+0

任何你用'foreach my $ key(keys%{...})看到的錯誤''不需要'使用'作爲'keys',對吧? – stevesliva

+1

@stevesliva,如果你這樣做,沒有辦法訪問這些值。 – ikegami

+0

哈,是的。我沒有想過迭代的一部分!噢,當然,你希望答案也是*有用*? – stevesliva