在perl正则表达式中,是否有一个更新匹配计数器,我可以在替换文本中用作前缀?例如,我想用position 1
、position 2
等替换每次出现的position
。
不,没有预定义的计数器,但您可以轻松地自己创建一个:
my $i = 1;
s/position/ "position " . $i++ /eg;
(使用/e
标志告诉perl将替换部分解析为代码块,而不是字符串)
制作自己的计数器。在替换的替换端声明一个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}
变量($&
的逐次匹配而不是全局版本):
use v5.10;
my $string = 'position position position';
$string =~ s{position}{
state $i = 0;
$i++;
"${^MATCH} $i"
}gpe;
say $string;
你还可以在替换部分做一些更有趣的事情:
my $string = '123 abc 456 xzy red 137';
$string =~ s{(d+|[a-z]+)}{
my $_ = $1;
state $letters = 0;
state $sum = 0;
if( /[a-z]/ ) {
$letters++;
"($letters: $_)";
}
elsif( /d/ ) {
$sum += $_;
}
}ge;
say $string;
应该这样做:
$ perl -e '$string = "position position position"; $i=1; $string =~ s/(position)/"$1 " . $i++/ge; print $string'
position 1 position 2 position 3
e
选项,它将替换文本作为Perl表达式求值。