不知道这是怎么回事,但似乎我的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 /.*/怎么可能不是有效的正则表达式?
答案 0 :(得分:2)
$&
。如果匹配不成功,则$&
不会更新并保留其先前的值。请参阅$MATCH
中的perlvar
变量。 (perldoc perlvar
并搜索$MATCH
)
答案 1 :(得分:1)
这很好。 $&
包含最后成功正则表达式匹配的字符串。我假设$riz
的内容不包含/href=(.*artist?)/
的匹配项。你应该检查正则表达式匹配的返回值。
您是否知道/artist?/
仅匹配artist
或artis
?
答案 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
但是没有东西可以在同一命令行中保留这些值,一旦正则表达式比较完成,它们将永远丢失。