这是我遇到的一个奇怪的问题(可能以前见过但从未注意过)。
这是代码的要点:
my $url = 'http://twitter.com/' . $handle;
my $page = get($url);
if($page =~ m/Web<\/span>\s*<a href=\"(.+?)\"/gi) {
$website = $1;
}
if($page =~ m/follower_count\" class=\"stats_count numeric\">(.+?)\s*</g) {
$num_followers = $1;
}
它获取一个 twitter url 并执行一些正则表达式来捕获关注者的数量和用户的网站。这段代码实际上工作正常。但是,当您在搜索关注者之后切换顺序并搜索网站时,网站显示为空。事实证明,当你正则表达式一个字符串时,它似乎保存了最后一次匹配的位置。在 html 中,关注者计数在网站显示后出现。如果您首先执行关注者计数正则表达式,就像它启动了关注者计数停止的网站正则表达式(如对字符串的索引引用)。
让我感到困惑的是,我在末尾有“g”运算符,表示“全局”,如“全局搜索字符串......从头开始”。
我在这里错过了什么吗?我似乎无法弄清楚为什么它会恢复字符串上的最后一个正则表达式位置(如果有道理的话)。
最佳答案
/g
在标量上下文中,修饰符不会做您认为它会做的事情。摆脱它。
如 perlretut解释说,/g
在标量上下文中依次循环每个匹配项。它设计用于循环,如下所示:
while ($str =~ /pattern/g) {
# match on each occurence of 'pattern' in $str in turn
}
另一种使用方式
/g
在列表上下文中:my @results = $str =~ /pattern/g; # collect each occurence of 'pattern' within $str into @results
如果您使用的是
/g
在标量上下文中并且您没有迭代它,您几乎肯定没有正确使用它。
关于regex - 如何让正则表达式从字符串的开头开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587539/