2014-07-18 55 views
0

當進入在下一次從中跳下後子循環,子循環迭代應該從開始:的Perl子循環無法重置迭代INTERAL變量

#!perl 

use 5.014; 

my %hash = ("a" => 1, "b" => 2 , "c" => 3); 
my $pos = 0; 
POS: 
while ($pos < 4) { 
    $pos++; 
    while (my ($key, $value) = each %hash) { 
     say "key: $key value: $value"; 
     next POS; 
    } 
} 

但結果如下:

$ perl bugs-loop.pl 
key: c value: 3 
key: a value: 1 
key: b value: 2 

如何得到以下結果:

key: c value: 3 
key: c value: 3 
key: c value: 3 
+2

我會避免使用每一個()的話 - 它太容易混淆時,哈希保持你多遠通過它迭代內部狀態。 – asjo

+0

確切地說,不要使用'each',除非你100%確定你迭代到散列的最後。 –

+0

@VadimPushtaev ...甚至不要使用'each'。 :-) – tobyink

回答

2

keys重置迭代器。重置HASH或ARRAY的內部迭代器(請參閱each)。特別是,在void context中調用keys將重置迭代器,而不會產生其他開銷。

#!perl 

use 5.014; 

my %hash = ("a" => 1, "b" => 2 , "c" => 3); 
my $pos = 0; 
POS: 
while ($pos < 4) { 
    $pos++; 
    while (my ($key, $value) = each %hash) { 
     say "key: $key value: $value"; 
     keys %hash; # Reset iterator since we're bailing out. 
     next POS; 
    } 
}