【问题标题】:Perl doesn't update to next matchPerl 不会更新到下一场比赛
【发布时间】:2012-06-13 13:24:51
【问题描述】:

不知道这是怎么发生的,但似乎我的 perl 正则表达式匹配在匹配后不会更新到下一个匹配。它没有在每次匹配时更新 $& 和 $1 变量,而是卡在第一个变量中。

我到处寻找,发现这非常令人沮丧。

查看下面调试器的输出,如您所见,第一个匹配有意义,但第二个没有。

谢谢

  DB<79>  $riz =~ m{url=(.*?)Support};

  DB<80> p$&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<81> $riz =~ m{href=(.*artist?)};

  DB<82> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<83>

更新: 这是另一个示例,显示文本“艺术家”在字符串中,但仍未找到。 $riz 的值是一个巨大的 HTML 代码,所以很难发布。

DB<103> $riz =~ m{url=(.*?)Support};

  DB<104> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<105> $riz =~ m{artist};

  DB<106> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<107> p  string.index($riz,"artist");
string105
  DB<108>

我的 $riz 是这个链接中的所有 HTML http://itunes.apple.com/us/app/id385972277

当您使用用户代理时 iTunes/10.2(Macintosh;U;PPC Mac OS X 10.2)


这是另一个使用相同 $riz 的示例

  DB<128>  $riz =~ m/.*/;

  DB<129> p $&;
url="http://www.svartapelsin.se" draggingName="Bunny Camp Support
  DB<130>
...
    DB<136> p substr $riz,0,20;
    <?xml version="1.0"
      DB<137>

我的意思是,这不是很荒谬吗?它应该刚刚输出了 $riz no 的值吗?如您所见,与所显示的形式不同。另外,m/.*/ 怎么可能不是有效的正则表达式?

【问题讨论】:

  • 如果$riz不匹配,那么$&amp;不会被修改。
  • 添加了一些示例代码..
  • 这里要学习的教训是,在大多数情况下,将匹配操作视为一个函数并简单地使用它的返回值,这样不容易出错 i>,不要依赖奇怪的副作用变量$1$&amp; 和朋友。在调试器中输入x $riz =~ m{url=(.*?)Support}
  • 什么是 $riz。你还没有发布。此外,您似乎认为您正在编写 javascript。 "string.index" 并没有像你想象的那样做。
  • 添加了对正确的 $riz 的引用和另一个我觉得很奇怪的例子

标签: regex perl


【解决方案1】:

$&amp; 会在匹配成功时更新。如果匹配不成功,则$&amp; 不会更新并保留其先前的值。请参阅 perlvar 中的 $MATCH 变量。 (perldoc perlvar 并搜索$MATCH

【讨论】:

    【解决方案2】:

    perldebug 这么说

    调试器无法识别的任何命令直接执行 (eval'd) 作为当前包中的 Perl 代码。

    请注意,上述 eval 受隐式范围的约束。结果任何 新引入的词法变量或任何修改过的捕获缓冲区 评估后内容丢失。调试器是一个很好的环境 学习 Perl,但如果你使用交互的材料进行实验 应该在同一范围内,放在一行中。

    所以$&amp;$1 等变量在调试器命令执行期间被本地化,并在命令完成时丢失。

    你可以使用

    $riz =~ m{url=(.*?)Support}; print $&, "\n"; print $1, "\n";
    

    $riz =~ m{url=(.*?)Support}; ($and, $one) = ($&, $1);
    p $and
    p $one
    

    但如果没有东西在同一命令行中保留这些值,一旦正则表达式比较完成,它们就会永远丢失。

    【讨论】:

    • 作为更新,这是 100% 导致一切无法正常工作的问题。是的,我的正则表达式可能有错误,但看起来不同。一旦我正确编写了调试器命令,其他一切都变得非常简单。 +20 点鲍罗丁
    • 几天前高度相关:Why doesn't eval '/(…)/' set $1?
    【解决方案3】:

    这很好。 $&amp; 包含最后一个 successful 正则表达式匹配的字符串。我假设$riz 的内容不包含/href=(.*artist?)/ 的匹配项。您应该检查正则表达式匹配的返回值。

    您是否知道/artist?/ 将只匹配artistartis

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2013-07-25
      • 2012-03-27
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多