2013-03-12 75 views
0

基本上,我循環瀏覽html文件並尋找一些正則表達式。它們匹配的很好,但我不希望每個文件都包含匹配項,但循環運行時,每次迭代都包含相同的匹配項(儘管它不在該文件中)。我假設通過使用$ 1它是堅持通過每次迭代。避免正則表達式匹配變量被重用

我試過在每次真正的匹配之後直接使用一個任意的正則表達式來重置它,但那似乎不起作用。我從這個主意中得到的線索似乎在最佳實踐和原始問題問題上有很多爭論,所以我認爲值得向我的代碼請求具體建議。很可能不是寫在一個偉大的方式之一:

# array of diff filenames 
opendir(TDIR, "$folder/diff/$today") || die "can't opendir $today: $!"; 
@diffList = grep !/^\.\.?$/, readdir(TDIR); 
closedir TDIR; 

# List of diff files 
print "List of Diff files:\n" . join("\n", @diffList) . "\n\n"; 

for($counter = 0; $counter < scalar(@diffList); $counter++) { 
    # Open diff file, read in to string 
    $filename = $diffList[$counter]; 
    open FILE, "<", "$folder/diff/$today/$filename"; 
    while(<FILE>) { 
     $lines .= $_; 
    } 
    close FILE or warn "$0: close today/$filename: $!"; 

    # Use regular expressions to extract the found differences 
    if($lines =~ m/$plus1(.*?)$span/s) { 
     $plus = $1; 
     "a" =~ m/a/; 
    } else {$plus = "0";} 
    if($lines =~ m/$minus1(.*?)$span/s) { 
     $minus = $1; 
     "a" =~ m/.*/; 
    } else {$minus = "0";} 

    # If changes were found, send them to the database 
    if($plus ne "0" && $minus ne "0") { 
     # Do stuff 
    } 
    $plus = "0"; 
    $minus = "0"; 
} 

如果我把裏面打印了「做的東西」的話,它總是真實,總是顯示在其中一個文件中發現相同的兩個值。 希望我已經足夠好地解釋了我的情況。任何意見表示讚賞,謝謝。

+0

向我們展示循環?你已經發布的代碼似乎很好看後... – Cameron 2013-03-12 21:38:21

+0

當然 - 讓我添加更多的信息 – Chris 2013-03-12 21:38:53

+0

基本上從一個目錄中獲取文件名列表到數組中,循環該數組並打開每個文件一個一。檢查兩個特定的正則表達式。如果兩個都匹配成功,我想將它們發送到數據庫(這一步很好)。如果使用相同的匹配(我知道只有一個文件),循環的每一步都會到達數據庫。 – Chris 2013-03-12 21:46:09

回答

1

可能是您的代碼將新讀取的文件中的行添加到$lines。您是否在每次迭代後嘗試明確地清除它?

+0

不,我沒有考慮過這可能是導致問題的部分。也許它只使用它每次發現的第一個文件(保留內容)。 – Chris 2013-03-12 21:46:58

+0

在循環底部添加$ lines =「」似乎具有積極作用。謝謝! – Chris 2013-03-12 21:48:21

0

它已被回答,但您也可以考慮閱讀文件的不同語法。它可以明顯更快,並幫助您避免這樣的小錯誤。

只需添加這讀取打開/關閉的文件:

local $/ = undef; 
$lines = <FILE>; 

那將暫時取消設置行分隔符,所以它讀取整個文件一次。如果您需要讀取同一範圍內的其他文件,請將其放在{}塊中。

+0

嗨,尼克,感謝您的提示 - 我將來一定記住。 – Chris 2013-03-14 10:41:29