1

我有一个哈希,填充了以下测试数据:

my %non_root_files = ('views/SPYGLASS_HOME/bin/sample_sgdc_file_contents_1.sgdc' => 1, 
                  'views/SPYGLASS_HOME/bin/sample_sgdc_file_contents.sgdc' => 1,
                  'views/SPYGLASS_HOME/bin/test_2.sgdc' => 1,
                  'views/SPYGLASS_HOME/bin/test_4.sgdc' => 1,
                  'views/SPYGLASS_HOME/bin/test_5.sgdc' => 1,
                  'views/SPYGLASS_HOME/bin/test_6.sgdc' => 1);

在另一个数组中,我有以下数据:

my @files = ('views/SPYGLASS_HOME/bin/sample_sgdc_file_contents.sgdc', 
             'views/SPYGLASS_HOME/bin/test_2.sgdc',
             'views/SPYGLASS_HOME/bin/sample_sgdc_file_contents_1.sgdc',
             'views/SPYGLASS_HOME/bin/test_5.sgdc',
             'views/SPYGLASS_HOME/bin/test_7.sgdc',
             'views/SPYGLASS_HOME/bin/sample_sgdc_file_contents_2.sgdc');

我需要做的是检查数组中的每个条目是否存在于哈希中,并从原始数组中删除,所以我这样做如下:

sub deleteDuplicate{

    $originalList_ref = shift;
    my $index = 0;
    foreach my $element (@{$originalList_ref})
    {
       if(exists $non_root_files{$element})
       {
          splice(@{$originalList_ref}, $index, 1);
       }
       $index++;
    }
}

但是,对于某些实际存在于散列中的条目,使用存在的查找失败。该元素存在于哈希中,但如果条件返回 false。谁能解释一下这个原因以及如何纠正它?

谢谢!

4

3 回答 3

3

布赖恩的评论是正确的;你要:

   if(exists $non_root_files{$element})
   {
      splice(@{$originalList_ref}, $index, 1);
   }
   else
   {
      $index++;
   }

(如果删除数组中的一个条目,下一个条目将移回相同的索引)。

于 2012-04-27T18:11:12.610 回答
3

关于perldoc perlsynforeach中的循环:

如果 LIST 的任何部分是一个数组,如果你在循环体中添加或删除元素,foreach 将变得非常混乱,例如使用 splice。所以不要那样做。

于 2012-04-27T23:14:20.193 回答
0

有一种更简单的方法可以做到这一点:

sub deleteDuplicate {
    $original_ref = shift;
    $originalList_ref = [ grep { ! exists $non_root_files{$_} } @$originalList_ref ];
}
于 2013-11-16T12:24:38.830 回答