我正在扫描XML文件并遍历文档中的每一行:
while ($line = <$fh>) {
if ($line =~ /<title>/.../<\/title>/) {
# something...
}
}
我不确定..
和...
运营商究竟发生了什么。
以前当我使用双点运算符..
时,我会收到错误
在模式匹配(m //)
中使用未初始化的值$ _
然而,当我使用三点运算符...
更改模式时,错误不再发生,脚本按预期工作。
我理解运营商的差异,但不是在这种背景下。
非常感谢任何解释这一点的帮助。
答案 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
匹配。