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


my $test = "There was once ann ugly ducking";
if ($test =~ m/ugly/g) {
    if ($test =~ m/here/g) {
        print 'Match';
    }
}

导致无输出,但

my $test = "There was once ann ugly ducking";
if ($test =~ m/here/g) {
    if ($test =~ m/ugly/g) {
        print 'Match';
    }
}

结果在匹配!

如果我从正则表达式中删除 g 标志,那么第二个内部测试会匹配匹配项$test中显示的任何方式。我找不到为什么会这样。

是的。该行为记录在手册页perlop。使用带有g标志的m/.../在字符串中前进以进行下一场比赛。

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

因此,在第一种情况下,ugly之后没有任何here子字符串,但在第二种情况下,它首先与There中的here匹配,然后找到ugly单词。

最新更新