据我所知,perl global'/ g'标志表示搜索将替换/返回整个字符串中的所有匹配项。但我无法理解它在匹配时对全局变量的反应方式,有人可以解释为什么这两个示例程序的输出之间存在差异:
版本1:
my $text = 'This is sample float value 3.2 ';
getFloat();
getFloat();
sub getFloat(){
if ($text =~ /([0-9]+?)(.?)([0-9]+?)/is){
print "matched> $1$2$3 ";
}
}
输出: 匹配> 3.2 匹配> 3.2
版本2:(带全局标记)
my $text = 'This is sample float value 3.2 ';
getFloat();
getFloat();
sub getFloat(){
if ($text =~ /([0-9]+?)(.?)([0-9]+?)/gis){
print "matched> $1$2$3 ";
}
}
输出: 匹配> 3.2
从输出中可以看出,全局标志匹配仅发生一次。有人可以解释这种行为。
答案 0 :(得分:10)
使用g
修饰符时,字符串会记住其上次匹配的位置,因此您可以在while循环中请求与g
匹配,并找到所有匹配项。
如果没有g
,您每次都会重新开始并始终找到第一场比赛。
在您的情况下,使用g
,您第一次匹配3.2,但第二次尝试匹配时,没有更多匹配。
如果没有g
,您可以拨打getFloat()
数千次,并且您将始终找到第一场比赛。
答案 1 :(得分:8)
在列表上下文中使用时,/g
会导致=~
返回所有匹配项。当在标量上下文中使用时,/g
会导致=~
每次使用时返回一个匹配,然后在没有更多匹配时失败(返回undef),然后再在开始时再次启动串。 (您可以使用/gc
来阻止此操作。)您还可以使用pos($text)
功能查找或设置开始匹配的位置。
如果没有/g
,=~
每次都会返回相同的匹配。这相当于每次都将pos($text)
设置为undef
。 (在列表上下文中,=~
会返回捕获列表。)