Perl 正则表达式在不同的迭代中用不同的值替换字符的所有实例



我有一个简单的问题与Perl中的正则表达式有关。假设我有一个字符串abcb并且我正在循环迭代。我想要的只是将abcb中的两个b字符替换为每个循环中的迭代器值。当我使用 $string=~s/b/$iterator/g 时,它会用迭代器的第一个值替换所有b

法典:

#!/usr/bin/perl 
use strict;
use warnings;
my $string="abcb";
for (my $iterator=0;$iterator<3;$iterator++)
{
    $string=~s/b/$iterator/g;
    print $string;
    print " ";          
}

获得的输出:a0c0 a0c0 a0c0

期望输出:a0c0 a1c1 a2c2

您的代码不起作用,因为您在循环的第一次迭代中替换了$string内部的两个b。之后正则表达式不再匹配,因为没有剩下b了。字符串中已经有两个零0

您有几种选择来解决此问题。

如果你有 Perl>= 5.14,你可以在替换上使用 /r 修饰符。它将返回替换项,而不是执行就地替换。

my $string="abcb";
foreach my $i (0 .. 2) {
    #                        V here
    print $string =~ s/b/$i/gr;
    print " ";          
}

另一种方法是将$string复制到循环中的新变量。确保它是一个词法(带my(,因为它在Perl中很好,在所需的最小范围内声明变量。

foreach my $i (0 .. 2) {
    my $copy = $string;
    $copy =~ s/b/$i/g;
    print $copy, " ";          
}

在所有情况下,我都用更简洁的foreach替换了你的 C 样式for(尽管 forforeach 关键字在 Perl 中是完全可以互换的(。这样做同样的事情,但更容易阅读。

最新更新