2012-04-30 175 views
0

我有一個大約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

回答

2

的效率,創建名爲@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

1

您也close(IN)和幾行後,你嘗試做while (<IN>)

請提供工作代碼和示例數據。否則,要弄清楚問題是什麼,這將是一項艱鉅的工作。

+0

我編輯了代碼,這是一個錯誤。代碼是我發佈的代碼,詳細的解釋是我正在檢查我的文件的每個單詞與我擁有的三個參考列表。上面代碼中的三個列表位於第一個while循環中,$ b [$ i],$ c [$ i]和$ d [$ i]就是列表的例子。第二個while循環是文件....希望這有助於 – Pink

3

我已編輯的代碼,現在只剩下最後一行得到印刷

現在你重新分配給@array在每遍:

while(<FILE>) 
    { 

[...] 

    @array = split ' ',$line; 

[...] 

    } 

    print OUT "@array"; 

當數組被打印出來,它只包含最後一行。最簡單的解決方案可能是將print OUT行移動到內部while()循環,最後。這樣它將在之前被打印出它被重新分配一個新行的內容。

+0

+1當我發佈我的評論時沒有看到你的答案。 – TLP

+0

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