2012-04-27 47 views
1

我有一个哈希值,用下面的测试数据填充:无法访问元素在一个Perl哈希

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

如果该键在散存在的查找是不是失败。我建议添加一些打印语句,以便实际看到发生了什么并调试您的代码。我会怀疑真正的问题是你在迭代它时修改你的数组,然后'$ index'不再正确。 – 2012-04-27 18:02:25

+0

什么是@files for?我没有看到它在你的代码中使用。 – Flimzy 2013-11-16 12:20:21

回答

3

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

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

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

3

关于foreach循环中perldoc perlsyn

如果LIST的任何部分是一个数组,会的foreach变得非常混乱,如果你 循环体内与剪接添加或删除元素,例如。 所以不要那样做。

+0

非常感谢!我以前没有遇到过。这是什么原因? – Izza 2012-04-28 03:54:54

0

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

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