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

ただし、ハッシュに実際に存在する一部のエントリでは、existsを使用したルックアップが失敗します。要素はハッシュにありますが、条件が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は非常に混乱します。だからそうしないでください。

于 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 に答える