2013-02-20 152 views
0

我有以下一段簡單的代碼(標識爲問題代碼片段並從一個更大的程序中提取)。逐行讀取文件迭代問題

難道是我還是可以在代碼中看到一個明顯的錯誤,即它在停止匹配$variable和打印$found的時候肯定應該這樣做?

當我嘗試打印$variable時沒有打印任何內容,而且我使用的文件中絕對存在匹配的行。

代碼:

if (defined $var) { 
    open (MESSAGES, "<$messages") or die $!; 
    my $theText = $mech->content(format => 'text'); 
    print "$theText\n"; 
    foreach my $variable (<MESSAGES>) { 
     chomp ($variable); 
     print "$variable\n"; 
     if ($theText =~ m/$variable/) { 
      print "FOUND\n"; 
     } 
    } 
} 

我已經找到了這個爲在該處發生異常,但不明白爲什麼了吧? 有些事我可以完全忽略,因爲它已經很晚了?

+0

是否打印了$ theText? – Borodin 2013-02-21 00:38:16

+0

是的網頁內容正在打印,我知道我的文本文件中的字符串是在內容中找到的,因爲我在模式匹配中硬編碼了字符串,並在內容中找到它 – 2013-02-21 00:43:16

+0

您應該嘗試將文件讀入一個數組,像'my @messages = ',然後你可以'打印標量@消息'來查看已經讀了多少行。我認爲這很可能是你拾取錯誤的文件,因爲'$ messages'不包含你認爲它所做的事情,或者因爲它正在查找錯誤的目錄。 – Borodin 2013-02-21 00:44:37

回答

4

更新我後來意識到我誤解了你的問題,這可能不能解決問題。然而,這些觀點是有效的,所以我將他們留在這裏。

您可能在$variable中有正則表達式元字符。該生產線

if ($theText =~ m/$variable/) { ... } 

應該

if ($theText =~ m/\Q$variable/) { ... } 

逃避任何有。

但是你確定你不只想要eq

此外,你應該使用

while (my $variable = <MESSAGES>) { ... } 

for循環將不必要地將整個文件讀入內存中讀取文件。而使用比$variable更好的名字。

+0

+1:主要用於'while'的建議... – 2013-02-21 01:34:44

+0

感謝關於使用'while'的觀點。我通常會這樣做,我只是想盡一切辦法讓代碼在這種情況下工作,謝謝你的幫助。 – 2013-02-21 16:43:15

+0

最後的問題是什麼? – Borodin 2013-02-22 10:22:08

2

這對我有用..我是否錯過了這個問題?你只是試圖將「$ theText」與文件中每行的任何內容匹配嗎?

#!/usr/bin/perl 

use warnings; 
use strict; 

my $fh; 
my $filename = $ARGV[0] or die "$0 filename\n"; 

open $fh, "<", $filename; 
my $match_text = "whatever"; 
my $matched = ''; 

# I would use a while loop, out of habit here 
#while(my $line = <$fh>) { 
foreach my $line (<$fh>) { 
    $matched = 
     $line =~ m/$match_text/ ? "Matched" : "Not matched"; 

    print $matched . ": " . $line; 
} 

close $fh 

./test.pl testfile 
Not matched: this is some textfile 
Matched: with a bunch of lines or whatever and 
Not matched: whatnot.... 

編輯:啊,我明白了。爲什麼不試試前和後打印「格格()」,看看你得到了什麼?這應該不是問題,但它不會損害測試每個案例。

+0

+1:檢查打開成功是個好主意,但三參數'open'和詞法文件句柄是好的。名義上,你應該關閉你打開的那個。 – 2013-02-21 01:36:24

+0

@JonathanLeffler - 對,*總是*關閉你打開的文件。我總是在它打開的範圍內關閉它們。 – chrsblck 2013-02-21 01:38:44

+1

僅供參考:因爲如果您使用'打開我的$ fh,'<',$ filename'或等效代碼,Perl會關閉該文件會在變量超出範圍時自動執行。請參閱Perl文檔中['open'](http://perldoc.perl.org/functions/open.html)末尾的信息。我傾向於明確地接近,但是我已經用Perl編寫了20多年(不寒而慄),並且在某些時候這是必要的。 – 2013-02-21 01:50:40