考虑以下嵌套循环:
my %deleted_documents_names = map { $_ => 1 }
$self->{MANUAL}->get_deleted_documents();
while($sth->fetch){
.....
.....
.....
while(my ($key, $value) = each(%deleted_documents_names)){
{
if($document_name eq $key){
$del_status=1;
last;
}
}
if($del_status==1){next;}
.....
.....
.....
.....
}
现在,我举一个样本案例,其中三个值(A,B,C)将与两个值(B,C)进行比较。
First scan:
A compared to B
A compared to C
Second scan:
B compared to B
Loop is terminated.
Third scan:
C is compared with C.
在这种情况下,C应该首先与B进行比较,作为第一个值,但是这个比较被跳过,并且它仅在找到相等的一个之后从下一个元素进行扫描。如果我删除最后一个终止条件并让循环运行总扫描次数,那么它可以正常工作,但我需要找出为什么在这种情况下,$ key指的是下一个比较值而不是第一个值一次循环在使用last关键字终止后重新启动。
任何帮助将不胜感激。
答案 0 :(得分:4)
使用
keys %deleted_documents_names ; # Reset the "each" iterator.
请参阅keys。
但是,为什么要迭代哈希?你为什么不
if (exists $deleted_documents_names{$document_name}) {
答案 1 :(得分:4)
each()
是一个函数,它从散列返回键值对,直到它到达结尾。它不知道它被调用的范围,并且对你的while循环逻辑一无所知。 See the documentation here
可以通过调用keys %hash
或values %hash
来重置。
更新:然而,正如Choroba指出的那样,你真的不需要这个循环。您的循环和随附的逻辑可以替换为:
next if (exists $deleted_documents_names{$document_name});
(哈希的设计结构允许快速找到密钥。事实上,这种结构使它们的名称为“哈希”。所以这样做比循环遍历所有元素和测试每一个)。