perl数组只打印最后一行

时间:2012-04-30 04:09:14

标签: perl

我有一个大约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);

3 个答案:

答案 0 :(得分:3)

  

我编辑了代码,现在只打印最后一行

现在,您将在每次传递时重新分配到@array

 while(<FILE>) 
  { 

[...]

    @array = split ' ',$line;

[...]

  }

  print OUT "@array";

当打印出数组时,它只包含最后一行。最简单的解决方案可能是将print OUT行转移到里面的 while()循环中,直到最后。通过这种方式,它将在之前打印出来,它会重新分配新行的内容。

答案 1 :(得分:2)

您创建了两个名为@array的变量。

my @array;
while(<IN>) 
 {
  ...
  my @array = split ' ',$line;

答案 2 :(得分:1)

此外,您close(IN)以后几行尝试while (<IN>)

请提供工作代码和示例数据。否则,找出问题所在将是一项艰巨的任务。