【问题标题】:Unable to Access Element in a Perl Hash无法访问 Perl 哈希中的元素
【发布时间】:2013-11-16 20:24:38
【问题描述】:

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

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。谁能解释一下这个问题的原因以及如何纠正它?

谢谢!

【问题讨论】:

  • 如果密钥存在于哈希中,则查找不会失败。我建议添加一些打印语句,这样您就可以实际查看正在发生的事情并调试您的代码。我会怀疑真正的问题是您在遍历数组时正在修改数组,然后您的 $index 不再正确。
  • @files 有什么用?我没有在您的代码中看到它。

标签: arrays perl hash array-splice


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    关于foreachperldoc perlsyn 中循环:

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

    【讨论】:

    • 非常感谢!我以前没有遇到过。这是什么原因?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 2013-06-06
      • 2013-08-09
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多