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";

When array gets printed out, it only contains the last line. The easiest solution is probably to move the print OUT line to inside the while() loop, right at the end. This way it will get printed out before it gets reassigned the contents of a new line.

于 2012-04-30T05:46:17.880 回答
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 回答