在带有替换表达式(/e
修饰符)的Perl正则表达式中,我试图找到当前匹配的位置。 pos
函数似乎就是我的意思。以下代码
my $string = "Hello world!";
$string =~ s/world/"$& (found at " . pos($string) . ")"/ge;
print "$string\n";
打印
Hello world (found at 6)!
但我无法找到文档中指定的位置。 documentation of pos
仅表示它返回"最后m//g
次搜索停止的位置的偏移量"。所以我不确定我是否可以依赖这种行为。
问题:pos
的这种用法是否在任何地方都有记录?我可以依赖pos
在不同的Perl版本下使用这种方式吗?有没有更好的方法来获得当前比赛的位置?
答案 0 :(得分:2)
您可以使用@-
和@+
变量来确定每个捕获组的开始/结束位置以及整个匹配。
@-[0]
将包含整个模式的 start 位置。在您的示例中,它将是6
。
@+[0]
将包含整个模式的 end 位置。在您的示例中,它将是11
。
以下是$-[0]
的示例:
my $string = "Hello world!";
$string =~ s/world/"$& (found at " . $-[0] . ")"/ge;
print "$string\n";
打印
Hello world(6点发现)!