0

約3000行のファイルがあります。ドキュメント内のすべての単語を、私が持っている参照リストと照合しています。単語がリスト内の単語と一致する場合は、それを置き換えます。ここでの問題は、コードが最後の行のみを出力し、ファイル全体を出力しないことです。

私のコードはそれほど効率的ではなく、処理に時間がかかると確信しています。コードの効率を上げる方法はありますか

open IN, "drug_list.txt" or die "No such file:$!\n";
open OUT, ">synergy1.txt" or die;
while(<IN>) {
      my @a=split /\t/,$_;
      $a[0]=~s/\s//g;
      $a[1]=~s/\s//g;
      $a[2]=~s/\s//g;
      $b[$i]=$a[0];
      $c[$i]=$a[1];
      $d[$i]=$a[2];
      ++$i;
}

use Data::Dumper;
open FILE, "input.txt" or die "No such file:$!\n";
while(<FILE>) {
    my $line= $_;
    chomp $line;
    $line =~ s/(\)|\()//g;
    $line =~ s/,/ ,/g;
    $line =~ s/\./ ./g;
    @array = split ' ',$line;

    for($k=0;$k<$i;++$k) {
        foreach $n(@array) {
            if($n=~m/^\Q$b[$k]\E$/i) {
                $n=~s/$n/<span style="background-color:yellow;">$n<\/span>/;
            }
            if($n=~m/^\Q$c[$k]\E$/i) {
                $n=~s/$n/<span style="background-color:red;">$n<\/span>/;
            }
            if($n=~m/^\Q$d[$k]\E$/i) {
                $n=~s/$n/<span style="background-color:blue;">$n<\/span>/;
            }
         }  # end foreach
     }      # end for
}           # end while
print OUT "@array";
close(FILE);
close(IN);
4

3 に答える 3

3

コードを編集しましたが、最後の行だけが印刷されるようになりました

@array今、あなたは各パスでに再割り当てしています:

 while(<FILE>) 
  { 

[...]

    @array = split ' ',$line;

[...]

  }

  print OUT "@array";

配列が出力されると、最後の行のみが含まれます。最も簡単な解決策は、おそらくprint OUT行をループの内側、つまり最後に移動することです。このようにして、新しい行の内容が再割り当てされるwhile()に印刷されます。

于 2012-04-30T05:46:17.880 に答える
2

という名前の 2 つの変数を作成します@array

my @array;
while(<IN>) 
 {
  ...
  my @array = split ' ',$line;
于 2012-04-30T04:12:06.313 に答える
1

また、あなたclose(IN)と数行後にやろうとしていますwhile (<IN>)

作業コードとサンプルデータを提供してください。そうでなければ、問題が何であるかを理解するのは難しい仕事です。

于 2012-04-30T04:25:44.960 に答える