是否有一个更新匹配计数器,我可以在替换文本中用作前缀



在perl正则表达式中,是否有一个更新匹配计数器,我可以在替换文本中用作前缀?例如,我想用position 1position 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表达式求值。

最新更新