我有一个简单的问题与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
(尽管 for
和 foreach
关键字在 Perl 中是完全可以互换的(。这样做同样的事情,但更容易阅读。