避免重用正则表达式匹配变量

时间:2013-03-12 21:34:56

标签: perl

基本上,我正在循环浏览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";
}

如果我在“do stuff”中放置一个打印,如果它始终为true,并且始终显示在其中一个文件中找到的相同的两个值。 希望我已经很好地解释了我的情况。感谢任何建议,谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码可能会将新读取的文件中的行附加到$lines。您是否尝试在每次迭代后明确清除它?

答案 1 :(得分:0)

它已经得到了解答,但您也可以考虑使用不同的语法来读取文件。它可以明显更快,并帮助您避免这样的小错误。

只需添加此项即可在打开/关闭之间读取文件:

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

这将暂时取消行分隔符,以便立即读取整个文件。如果您需要读取同一范围内的另一个文件,请将其括在{}块中。