我在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
答案 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
(尽管for
和foreach
关键字在Perl中完全可以互换。这也是一样的,但更容易阅读。