Perl双点范围运算符.. vs三点...

时间:2013-04-10 18:28:54

标签: perl

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

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

我不确定.....运营商究竟发生了什么。 以前当我使用双点运算符..时,我会收到错误

  

在模式匹配(m //)

中使用未初始化的值$ _

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

我理解运营商的差异,但不是在这种背景下。

非常感谢任何解释这一点的帮助。

2 个答案:

答案 0 :(得分:11)

perlop说这个

  

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

因此,对于三个点,如果它与开始标记位于同一行,则代码将不会注意到结束</title>

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

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

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

答案 1 :(得分:4)

这一行:

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

解析为

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

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