Arrays 无法访问Perl哈希中的元素

Arrays 无法访问Perl哈希中的元素,arrays,perl,hash,array-splice,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' =

我有一个散列,填充了以下测试数据:

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的查找失败。元素在散列中,但如果条件返回false。有人能解释一下原因和如何纠正吗


谢谢

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

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

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

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

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

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

关于
foreach
循环:

若列表的任何部分是数组,若您 在回路主体内添加或删除图元,例如使用接头。 所以不要那样做


关于
foreach
中的循环:

若列表的任何部分是数组,若您 在回路主体内添加或删除图元,例如使用接头。 所以不要那样做


有一种更简单的方法:

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

有一种更简单的方法:

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

如果哈希中存在密钥,则查找不会失败。我建议添加一些print语句,这样您就可以真正看到正在发生的事情并调试代码。我怀疑真正的问题是,您在遍历数组时正在修改数组,而您的
$index
不再正确。@files用于什么?我看不到您的代码中使用了该键。如果哈希中存在该键,则查找不会失败。我建议添加一些print语句,这样您就可以真正看到正在发生的事情并调试代码。我怀疑真正的问题是,您在遍历数组时正在修改数组,而您的
$index
不再正确。@files用于什么?我看你的代码中没有用到它。非常感谢!我以前从未遇到过这种情况。这是什么原因?非常感谢!我以前从未遇到过这种情况。这是什么原因?