如何使用s///;
搜索并替换特定次数的匹配项。例如:
$string="abcabdaaa";
我想在a
n次中将i
替换为$string
。我怎样才能做到这一点? n是用户提供的整数。
答案 0 :(得分:9)
简单的答案可能并不是你想要的。
my $str = 'aaaa';
$str =~ s/a/a_/ for 1..2;
print $str, "\n"; # a__aaa. But you want a_a_aa, right?
您需要自己计算替换次数,并采取相应措施:
$str = 'aaaa';
my $n = 0;
$str =~ s/(a)/ ++$n > 2 ? $1 : 'a_' /ge;
print $str, "\n";
有关相关示例,请参阅常见问题解答How do I change the Nth occurrence of something?。
答案 1 :(得分:6)
只需替换$ n次:
$string =~ s/a/i/ for 1..$n;
这样做。
my $i = 0; # count the substitutions made
$string =~ s/(a)/ ++$i > $n ? $1 : "i" /ge;
答案 2 :(得分:4)
我不知道有任何旗帜可以做到这一点。我只是使用一个循环:
for (my $i = 0; $i < $n; $i++)
{
$string =~ s/a/i/;
}
答案 3 :(得分:4)
你可以试试这个:
$str1=join('i',split(/a/,$str,$n));
答案 4 :(得分:1)
#!/usr/bin/perl
use strict; use warnings;
my $string = '***ab***c';
my $n = 3;
1 while $n -- and $string =~ s/\*([^\n])/*\n$1/;
print "$string\n";
输出:
* * * ab***c
答案 5 :(得分:0)
使用
sub substitute_n {
my $n = shift;
my $pattern = shift;
my $replace = shift;
local $_ = shift;
my $i = 1;
s{($pattern)} {
$i++ <= $n ? eval qq{"$replace"} : $1;
}ge;
$_;
}
然后你可以写
my $s = "***ab***c";
print "[", substitute_n(2, qr/\*/, '$1\n', $s), "]\n";
获取以下输出:
[* * *ab***c]