使用'last'关键字终止循环时,不会重新初始化散列值

时间:2013-02-21 10:34:36

标签: perl perl-data-structures

考虑以下嵌套循环:

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关键字终止后重新启动。

任何帮助将不胜感激。

2 个答案:

答案 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 %hashvalues %hash来重置。

更新:然而,正如Choroba指出的那样,你真的不需要这个循环。您的循环和随附的逻辑可以替换为:

next if (exists $deleted_documents_names{$document_name});

(哈希的设计结构允许快速找到密钥。事实上,这种结构使它们的名称为“哈希”。所以这样做比循环遍历所有元素和测试每一个)。