0

重複の可能性:
Perl を使用した 2 つの配列の比較

両方のファイルに共通する要素を見つけようとしています。以下は私のコードです。私がしている間違いを教えてください。

open IN,  "New_CLDB.txt"     or die "couldn't locate input file";
open IN1, "New_adherent.txt" or die "couldn't locate input file";
use Data::Dumper;
@array = ();
while (<IN>) {
    $line = $_;
    chomp $line;
    $a[$i] = $line;
    ++$i;
}
while (<IN1>) {
    $line1 = $_;
    chomp $line1;
    $b[$m] = $line1;
    ++$m;
}
for ( $k = 0; $k < $i; ++$k ) {
    for ( $f = 0; $f < $m; ++$f ) {
        if ( $a[$k] ne $b[$f] ) {
            push( @array, $a[$k] );
        }
    }
}
print @array, "\n";
4

3 に答える 3

6

私がしている間違いを教えてください。

あなたのコードを表面的に見てから、ここにリストがあります:

  • strictプラグマを使用しない
  • あなたが達成したいことの正確な仕様を持っていない
  • 一度に多くのことをしようとする

コードから一歩離れて、平易な英語で考えてみてください。あなたは何をする必要がありますか?

  • ファイルの読み取り - 開く、読み取る、閉じる
  • ファイルデータを配列に読み込みます - どのように正確ですか?
  • ファイル A とファイル B に対して同じことを繰り返さない関数を使用する
  • 配列を比較する

常に を使用して、各タスクを個別に実行しstrictます。いつも。その後、単一のステップをより大きなスクリプトに構成します。

この他の SO question もご覧ください。

于 2012-04-10T21:42:46.893 に答える
3

2 番目のセットに重複がない場合:

my %set1;
while (<$fh1>) {
   chomp;
   ++$set1{$_};
}

while (<$fh2>) {
   chomp;
   print("$_ is common to both sets\n")
      if $set1{$_};
}

2 番目のセットに重複がある可能性がある場合:

my %set1;
while (<$fh1>) {
   chomp;
   ++$set1{$_};
}

my %set2;
while (<$fh2>) {
   chomp;
   print("$_ is common to both sets\n")
      if $set1{$_} && !$set2{$_}++;
}
于 2012-04-10T22:53:46.283 に答える
1

改善すべき点がいくつかあります。

  1. いつもuse strict;そしてuse warnings;
  2. の 3 つの引数バージョンを使用します。open
  3. レキシカルファイルハンドルを使う
  4. 意味のある書式設定/インデントを使用する
  5. で配列を追加しますpush @array, $value;

SO の質問については、正確には何が問題で、何を期待していますか。

于 2012-04-10T21:46:26.637 に答える