1

假设my $string = "XXXXXTPXXXXTPXXXXTP"; 我想匹配:$string =~ /TP/;多次并返回每个位置,我该怎么做?

我试过了$-[0]$-[1]$-[2]我只得到了一个职位$-[0]

编辑:我也尝试过全局修饰符//g,但它仍然不起作用。

4

2 回答 2

4

$-[1]是第一次捕获捕获的文本的位置。您的模式没有捕获。

通过在标量上下文中调用//g,只会找到下一个匹配项,从而允许您获取该匹配项的位置。只需这样做,直到找到所有匹配项。

while ($string =~ /TP/g) {
   say $-[0];
}

当然,您可以轻松地将它们存储在变量中。

my @positions;
while ($string =~ /TP/g) {
   push @positions, $-[0];
}
于 2015-08-07T20:38:15.143 回答
0

你可以试试:

use feature qw(say);
use strict;
use warnings;

my $str = "XXXXXTPXXXXTPXXXXTP";

# Set position to 0 in order for \G anchor to work correctly
pos ($str) = 0;

while ( $str =~ /\G.*?TP/s) {
    say ($+[0] - 2);
    pos ($str) = $+[0]; # update position to end of last match
}
于 2015-08-07T20:33:14.407 回答