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

Perl双点范围运算符。。vs三点。。。,perl,Perl,我正在扫描一个XML文件并循环浏览文档中的每一行: while ($line = <$fh>) { if ($line =~ /<title>/.../<\/title>/) { # something... } } while($line=){ 如果($line=~/…//){ #有些事。。。 } } 我不确定。和…操作符到底发生了什么。 以前当我使用双点运算符。时,我会收到错误 在模式匹配(m/)中使用未初始化的值$\u

我正在扫描一个XML文件并循环浏览文档中的每一行:

while ($line = <$fh>) {
    if ($line =~ /<title>/.../<\/title>/) {
        # something...
    }
}
while($line=){
如果($line=~/…//){
#有些事。。。
}
}
我不确定
操作符到底发生了什么。 以前当我使用双点运算符
时,我会收到错误

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

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

我大体上理解运算符之间的差异,但在这种情况下不理解

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

如是说

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

因此,使用三个点,如果结束标记与开始标记出现在同一行,则代码不会注意到结束标记

但是,问题是您正在测试
中的
中的
。你的意思是

if ($line =~ /<title>/ .. $line =~ /<\/title>/) { ... }
if($line=~/..$line=~/){…}
但是请不要那样做!您可能认为它按原样工作,但显然您已经在运行错误的代码。正则表达式是处理XML的错误工具:请使用 或 相反。

这一行:

if ($line =~ /<title>/.../<\/title>/)
if($line=~/…//)
解析为

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

这意味着range运算符的右侧正在尝试与
$\uuu
匹配,而不是与
$行
匹配

通常的咒语是:不要试图用正则表达式解析XML。使用合适的XML解析器。@Quentin:测试是否在包含打开和关闭标记的行之间。啊,谢谢。是的,我意识到应该避免使用正则表达式来解析XML,只是想让自己熟悉这种语言。谢谢@Wubzorz:我建议你使用良好的实践来熟悉自己,否则当你问关于代码的问题时,你会怒不可遏:)是的,谢谢。这不是我解析XML文件的方法,更像是搔痒,因为我对Perl不太熟悉。