Perl不会更新到下一场比赛

时间:2012-06-13 13:24:52

标签: regex perl

不知道这是怎么回事,但似乎我的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>

更新: 这是另一个示例,显示文本“artist”在字符串中,但它仍然没有找到它。 $ 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 /.*/怎么可能不是有效的正则表达式?

3 个答案:

答案 0 :(得分:2)

只要成功匹配,就会更新

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

答案 1 :(得分:1)

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

您是否知道/artist?/仅匹配artistartis

答案 2 :(得分:1)

perldebug说这个

  

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

     

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

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

您可以使用

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

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

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