2012-04-30 4 views
0

У меня есть файл около 3000 строк. Я сопоставляю каждое слово в документе со списками ссылок, которые у меня есть. Если слово соответствует одному в моем списке, я подставляю его. Проблема в том, что код только печатает последнюю строку, но не весь файл.perl array только печатает последнюю строку

Я уверен, что мой код не так эффективен и займет много времени, чтобы обработать, есть в любом случае для повышения эффективности кода

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' каждую итерацию цикла. Для меня это довольно просто. Если вы должны были сделать 'for (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 '$';' одна строка вверх, поэтому она выше '} # end while' – simbabque

Смежные вопросы