帮助理解perl中的全局标志

sci*_*hul 9 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 ";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: 匹配> 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 ";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出: 匹配> 3.2

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

Ray*_*oal 10

使用g修饰符,字符串会记住其最后一次匹配的位置,因此您可以请求与gwhile循环匹配并查找所有匹配项.

没有g你每次重新开始,总是找到第一场比赛.

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

如果没有g你,你可以拨打getFloat()无数次,你总能找到第一场比赛.


Nei*_*eil 8

在列表上下文中使用时,/g会导致=~返回所有匹配项.当在标量上下文中使用时,/g导致=~每次使用时返回一个匹配,然后在没有更多匹配时失败(返回undef),然后在字符串的开头再次启动.(您可以通过使用来防止这种情况/gc.)您还可以使用该pos($text)功能查找或设置开始匹配的位置.

没有/g,=~每次总是返回相同的匹配.这相当于设置pos($text)undef各一次.(在列表上下文中,=~返回捕获列表.)