全局g正则表达式标志的奇怪行为

San*_*rix 5 regex perl global

my $test = "There was once an\n ugly ducking";
if ($test =~ m/ugly/g) {
    if ($test =~ m/here/g) {
        print 'Match';
    }
}
Run Code Online (Sandbox Code Playgroud)

结果没有输出,但是

my $test = "There was once an\n ugly ducking";
if ($test =~ m/here/g) {
    if ($test =~ m/ugly/g) {
        print 'Match';
    }
}
Run Code Online (Sandbox Code Playgroud)

比赛结果!

如果我从正则表达式中删除g标志,那么第二次内部测试会匹配在$ test中出现的匹配项.我找不到为什么会这样的参考.

Bir*_*rei 9

是.该行为记录在perlop手册页中.在字符串中使用m/.../with gflag进行下一次匹配.

在标量上下文中,每次执行"m // g"都会找到下一个匹配项,如果匹配则返回true,如果没有进一步匹配则返回false.可以使用"pos()"函数读取或设置最后一次匹配后的位置; 在perlfunc中看到"pos".失败的匹配通常会将搜索位置重置为字符串的开头,但您可以通过添加"/ c"修饰符(例如"m // gc")来避免这种情况.修改目标字符串也会重置搜索位置.

因此,在第一种情况下,ugly没有任何子here字符串,但在第二种情况下,它首先匹配here,There然后它找到该ugly字.