0

不知道这是怎么发生的,但似乎我的 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/.*/ 怎么可能不是有效的正则表达式?

4

3 回答 3

2

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

于 2012-06-13T13:34:49.877 回答
1

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

你知道那/artist?/将只匹配artistartis吗?

于 2012-06-13T13:35:34.360 回答
1

perldebug说这个

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

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

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

你可以使用

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

或者

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

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

于 2012-06-13T17:29:46.230 回答