无法访问Perl哈希中的元素

时间:2012-04-27 17:58:02

标签: arrays perl hash array-splice

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

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++;
    }
}

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

谢谢!

3 个答案:

答案 0 :(得分:3)

Brian的评论是正确的;你想要的:

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

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

答案 1 :(得分:3)

关于perldoc perlsyn中的foreach循环:

  

如果LIST的任何部分是一个数组,如果你,foreach将会非常困惑   添加或删除循环体内的元素,例如使用拼接。   所以不要这样做。

答案 2 :(得分:0)

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

sub deleteDuplicate {
    $original_ref = shift;
    $originalList_ref = [ grep { ! exists $non_root_files{$_} } @$originalList_ref ];
}