【问题标题】:Perl double-dot range operator .. vs triple-dot ...Perl 双点范围运算符 .. vs 三点范围 ...
【发布时间】:2018-03-26 02:38:03
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 通常的咒语:不要试图用正则表达式解析 XML。使用适当的 XML 解析器.
  • @Quentin:测试您是否在包含打开和关闭&lt;title&gt; 标记的行之间。

标签: perl


【解决方案1】:

perlop 这么说

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

因此,如果&lt;/title&gt; 与开始标记出现在同一行,那么您的代码将不会注意到结束标记&lt;/title&gt;

但是,问题是您正在测试 $line 中的 &lt;title&gt;$_ 中的 &lt;/title&gt;。你的意思是

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

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

【讨论】:

  • 啊,谢谢。是的,我意识到应该避免使用正则表达式来解析 XML,只是试图让自己熟悉这种语言。谢谢!
  • @Wubzorz:我建议您使用 good practice 来熟悉自己,否则当您询问有关您的代码的问题时,您会被激怒:)
  • 是的,谢谢。这不是我解析 XML 文件所采用的方法,更多的是因为我对 Perl 不熟悉而搔痒。
【解决方案2】:

这一行:

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

解析为

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2011-01-21
    • 2010-09-09
    • 2020-10-08
    • 2011-02-23
    • 2022-11-12
    相关资源
    最近更新 更多