2013-03-12 77 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