帮助理解perl中的全局标志

时间:2011-08-06 22:00:23

标签: regex perl

据我所知,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

从输出中可以看出,全局标志匹配仅发生一次。有人可以解释这种行为。

2 个答案:

答案 0 :(得分:10)

使用g修饰符时,字符串会记住其上次匹配的位置,因此您可以在while循环中请求与g匹配,并找到所有匹配项。

如果没有g,您每次都会重新开始并始终找到第一场比赛。

在您的情况下,使用g,您第一次匹配3.2,但第二次尝试匹配时,没有更多匹配。

如果没有g,您可以拨打getFloat()数千次,并且您将始终找到第一场比赛。

答案 1 :(得分:8)

在列表上下文中使用时,/g会导致=~返回所有匹配项。当在标量上下文中使用时,/g会导致=~每次使用时返回一个匹配,然后在没有更多匹配时失败(返回undef),然后再在开始时再次启动串。 (您可以使用/gc来阻止此操作。)您还可以使用pos($text)功能查找或设置开始匹配的位置。

如果没有/g=~每次都会返回相同的匹配。这相当于每次都将pos($text)设置为undef。 (在列表上下文中,=~会返回捕获列表。)