在perl正则表达式中,是否有更新匹配计数器,我可以将其用作替换文本中的前缀?例如,我想将position
的每个匹配项替换为position 1
,position 2
等等。
答案 0 :(得分:3)
不,没有预定义的计数器,但您可以自己轻松创建一个:
/e
(使用{{1}}标志告诉perl将替换部分解析为代码块,而不是字符串。)
答案 1 :(得分:3)
制作自己的专柜。在替换的替换侧声明state
并为每次替换增加它。除了变量的范围外,这与其他答案类似:
use v5.10;
my $string = 'position position position';
$string =~ s{position}{
state $i = 0;
$i++;
"POS $i"
}ge;
say $string;
捕获变量可用,因此您可以使用$1
,$&
等等:
use v5.10;
my $string = 'position position position';
$string =~ s{position}{
state $i = 0;
$i++;
"$& $i"
}ge;
say $string;
但是,由于state
需要v5.10,因此您可以使用/p
开关和${^MATCH}
变量(每个匹配而非{{1}的全局版本}):
$&
而且,你可以在替代方面做更好的事情:
use v5.10;
my $string = 'position position position';
$string =~ s{position}{
state $i = 0;
$i++;
"${^MATCH} $i"
}gpe;
say $string;
答案 2 :(得分:1)
这样的事应该做:
$ perl -e '$string = "position position position"; $i=1; $string =~ s/(position)/"$1 " . $i++/ge; print $string'
position 1 position 2 position 3
这里的技巧是使用e
选项,它将替换文本作为Perl表达式进行评估。