perl数组只打印最后一行

问题描述:

我有一个大约3000行的文件。我将文档中的每个单词与我拥有的参考列表进行匹配。如果该单词与我列表中的单词匹配,那么我将它替换。 现在的问题是代码只打印最后一行,而不打印整个文件。perl数组只打印最后一行

我相信,我的代码是不是有效,将需要很长的时间来处理,反正是有增加的代码

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); 
+1

你的缩进是可怕的。你应该修复这个问题,以便你可以阅读你自己的代码。 – TLP

+0

我为你修好了。现在很容易发现你的问题:你的语句'print OUT'@array“'在循环之外,因此它只打印分配给它的最后一行。 – TLP

的效率,创建名为@array两个变量。

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

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

+0

@Pink这是因为您在每个循环迭代中设置了@array = split'',$ line'。对我来说似乎很基本。如果你要为(0..10){$ num = $ _}打印“$ num”,你不希望它打印出'0 1 2 3 4 5 6 7 8 9 10',对吧?它会打印您设置的最后一个值,而不是它过去设置的所有值。如果您要将打印语句*放在循环中,它可能会更好。 – TLP

您也close(IN)和几行后,你尝试做while (<IN>)

请提供工作代码和示例数据。否则,要弄清楚问题是什么,这将是一项艰巨的工作。

+0

我编辑了代码,这是一个错误。代码是我发布的代码,详细的解释是我正在检查我的文件的每个单词与我拥有的三个参考列表。上面代码中的三个列表位于第一个while循环中,$ b [$ i],$ c [$ i]和$ d [$ i]就是列表的例子。第二个while循环是文件....希望这有助于 – Pink

我已编辑的代码,现在只剩下最后一行得到印刷

现在你重新分配给@array在每遍:

while(<FILE>) 
    { 

[...] 

    @array = split ' ',$line; 

[...] 

    } 

    print OUT "@array"; 

当数组被打印出来,它只包含最后一行。最简单的解决方案可能是将print OUT行移动到内部while()循环,最后。这样它将在之前被打印出它被重新分配一个新行的内容。

+0

+1当我发布我的评论时没有看到你的答案。 – TLP

+0

@Pink:把'print OUT'$ array';'一行放在上面,所以它在'}#上面,而' – simbabque