2014-01-06 164 views
5
my $test = "There was once an\n ugly ducking"; 
if ($test =~ m/ugly/g) { 
    if ($test =~ m/here/g) { 
     print 'Match'; 
    } 
} 

在没有输出结果,但在比赛怪异的行为

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

结果!

如果我从正则表达式中删除g标志,那么第二个内部测试将匹配$ test中出现的任何匹配。我无法找到为什么这样的参考。

回答

9

是的。该行为记录在perlop手册页中。使用m/.../g标志在字符串中进行下一次匹配。

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

因此,在第一种情况下ugly后没有任何here子,但在第二种情况下,第一个匹配Therehere,后来它发现ugly字。

+0

我觉得很愚蠢! :) – Santrix