2013-08-07 25 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

爲什麼你期望的那樣。該代碼打印'發現!'當'字符串'只匹配在您的文件的第一行? – kjprice

+2

@kjprice:您編輯了一個代碼中的錯誤 – toolic

+0

@toolic,哇,我認爲不會編譯.. 。只是認爲這是一個錯字 – 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

問題你擁有的$line = <INFILE>實際分配文件的完整內容$line掌握在while (! $found && ($line = <INFILE>))

條件部分。 它確實不是逐行分配。通過擴展,您的循環只運行一次。

可能的解決方案來解決這個問題是:

  • 你應該循環更改爲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的良好做法其他答案要點適用照常