2013-08-07 3 views
0

В моем скрипте perl я открыл файл и искал строку. Это было успешно. Но когда я снова ищу ту же строку сразу после этого поиска, кажется, что скрипт начинает поиск там, где он был до конца файла, и, следовательно, он больше не может найти совпадение. Мой код что-то вроде:Perl: поиск соответствия несколько раз в файле

open (INFILE, "./input.txt") 

for($i=0; $i < 3; $i++){ 

    print "i = $i\n"; 
    $found = 0; 

    while (! $found && ($line = <INFILE>)){ 
     if ($line =~ /string/ ){ 
      print "found!\n"; 
      $found = 1; 
     } 
     else{ 
      print "not found!\n"; 
     } 
    } 
} 

close (INFILE); 

input.txt файл:

string 
random2 
random2 

Я ожидал, что выход будет:

i = 0 
found! 
i = 1 
found! 
i = 2 
found! 

, но оказывается, :

i = 0 
found! 
i = 1 
not found! 
not found! 
i = 2 

Может ли кто-нибудь помочь мне в этом. Я только начал изучать perl.

+1

Почему вы ожидали бы. этот код для печати 'found!', когда 'string' совпадает только в первой строке вашего файла? – kjprice

+2

@kjprice: Вы отредактировали ошибку в коде. – toolic

+0

@toolic, Woah, я думал, что не компилируется .. просто показалось, что это опечатка. – kjprice

ответ

0

Вы получаете это, потому что, когда вы читаете файл в Perl это будет означать последнюю позицию вы читаете в файле, поэтому он не будет читать это снова, в вашем случае вы читаете весь файл, чтобы вы отметили в конце файла, и вам нужно сбросить позицию, повторив поиск до начала.

for($i=0; $i < 3; $i++){ 
    seek(INFILE,0,0); 
    #... 

Это сбросит указатель_на_файл начала снова увидеть perl seek tut

Поскольку вы начинаете изучение Perl, то вот основные инструкции, то вы можете использовать

  • всегда используют strict

  • используют трех- аргумент формы open

    open (my $INFILE, "<", "./input.txt"); 
    
  • использование my с каждой переменной для локализации

+0

Это работает! mamod, спасибо за ваши предложения! Я ценю это! – Jaricftw

+0

Добро пожаловать и благодарю вас за то, что вы дали мне мой первый принятый ответ :) – mamod

1

Изменение:

if ($line = ~/string/ ){ 

к:

if ($line =~ /string/ ){ 
0

Этот вопрос у вас есть ложь в условной части while (! $found && ($line = <INFILE>))

$line = <INFILE>фактически присваивает все содержимое файла в $line. Это NOT назначить линию по строке. По расширению ваш цикл работает только один раз.

Возможные решения, чтобы исправить это, являются:

  • Вы должны изменить цикл, чтобы for my $line (<INFILE>) прочитать файл построчно, и отделят $ найдены во внутренний if($found).
  • Используйте внешнюю for петли для вашей работы (while является unnecessary`:

    open (INFILE, "./input.txt") 
    
    my @line=<INFILE>; 
    for($i=0; $i < scalar @line; $i++) { 
        print "i = $i\n"; 
        if ($line[$i] =~ /string/ ){ 
         print "found!\n"; 
        } else { 
         print "not found!\n"; 
        } 
    } 
    
    close (INFILE); 
    

Точка в других ответах на вопросы о Perl передовой практике применяется как обычно

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