Тот, который легко отключить, преждевременно прерывает цикл, повторяя хэш с each
.
#!/usr/bin/perl
use strict;
use warnings;
my %name_to_num = ( one => 1, two => 2, three => 3 );
find_name(2); # works the first time
find_name(2); # but fails this time
exit;
sub find_name {
my($target) = @_;
while( my($name, $num) = each %name_to_num ) {
if($num == $target) {
print "The number $target is called '$name'\n";
return;
}
}
print "Unable to find a name for $target\n";
}
Выход:
The number 2 is called 'two'
Unable to find a name for 2
Это, очевидно, глупый пример, но точка зрения остается в силе - при переборе хэша с each
вы никогда не должны last
или return
выходить из цикла; или перед каждым поиском следует сбрасывать итератор (с keys %hash
).