Perl Regex用不同迭代中的不同值替换字符的所有实例

时间:2017-06-10 11:23:43

标签: regex perl

我在Perl中有一个与Regex相关的简单问题。 假设我有一个字符串abcb,我正在迭代循环。我想要的只是b中的abcb个字符都被每个循环中的迭代器的值替换。当我使用$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

1 个答案:

答案 0 :(得分:5)

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

您有几种方法可以解决此问题。

如果你有Perl&gt; = 5.14,你可以在替换上使用the /r modifier。它将返回替换而不是进行就地替换。

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, " ";          
}

在所有情况下,我都将C风格的for替换为更为简洁的foreach(尽管forforeach关键字在Perl中完全可以互换。这也是一样的,但更容易阅读。