6

我正在扫描一个 XML 文件并遍历文档中的每一行:

while ($line = <$fh>) {
    if ($line =~ /<title>/.../<\/title>/) {
        # something...
    }
}

我不确定关于..and...操作符到底发生了什么。以前当我使用双点运算符时,..我会收到错误

在模式匹配中使用未初始化的值 $_ (m//)

但是,当我使用三点运算符更改模式...时,不再发生错误并且脚本按预期工作。

我一般理解运营商的差异,但不是在这种情况下。

任何帮助解释这一点将不胜感激。

4

2 回答 2

11

perlop说这个

如果您不希望它在下一次评估之前测试正确的操作数,例如在 sed 中,只需使用三个点(“...”)而不是两个点。在所有其他方面,“...”的行为就像“..”一样。

</title>因此,如果您的代码与开始标记出现在同一行,则使用三个点您的代码将不会注意到结束。

但是,问题是您正在测试<title>in$line</title>in $_。你的意思是

if ($line =~ /<title>/ .. $line =~ /<\/title>/) { ... }

请不要那样做!您可能认为它按原样工作,但您显然已经在运行错误的代码。正则表达式是处理 XML 的错误工具:请使用 XML::Twig or XML::LibXML 代替。

于 2013-04-10T18:34:53.547 回答
4

这一行:

if ($line =~ /<title>/.../<\/title>/)

解析为

if ( ($line =~ /<title>/) ... /<\/title>/ )

这意味着范围运算符的右侧正在尝试匹配$_而不是$line.

于 2013-04-10T18:38:08.650 回答