Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中搜索和替换字符串中特定次数的匹配项?_Perl - Fatal编程技术网

如何在Perl中搜索和替换字符串中特定次数的匹配项?

如何在Perl中搜索和替换字符串中特定次数的匹配项?,perl,Perl,如何使用s//;,搜索并替换指定次数的匹配项;。例如: $string="abcabdaaa"; 我想用$string中的I替换a n次。我该怎么做?n是用户提供的整数。我不知道有任何标志会这样做。我只需要使用一个循环: for (my $i = 0; $i < $n; $i++) { $string =~ s/a/i/; } 我不知道有哪面旗帜会这么做。我只需要使用一个循环: for (my $i = 0; $i < $n; $i++) { $string =~ s

如何使用s//;,搜索并替换指定次数的匹配项;。例如:

$string="abcabdaaa";

我想用$string中的I替换a n次。我该怎么做?n是用户提供的整数。

我不知道有任何标志会这样做。我只需要使用一个循环:

for (my $i = 0; $i < $n; $i++)
{
   $string =~ s/a/i/;
}

我不知道有哪面旗帜会这么做。我只需要使用一个循环:

for (my $i = 0; $i < $n; $i++)
{
   $string =~ s/a/i/;
}

只需替换$n次:

$string =~ s/a/i/ for 1..$n;
这就行了。 更普遍的解决方案是使用计数器进行全局替换:

my $i = 0; # count the substitutions made
$string =~ s/(a)/ ++$i > $n ? $1 : "i" /ge; 

只需替换$n次:

$string =~ s/a/i/ for 1..$n;
这就行了。 更普遍的解决方案是使用计数器进行全局替换:

my $i = 0; # count the substitutions made
$string =~ s/(a)/ ++$i > $n ? $1 : "i" /ge; 
您可以尝试以下方法:

$str1=join('i',split(/a/,$str,$n));
您可以尝试以下方法:

$str1=join('i',split(/a/,$str,$n));

简单的答案可能不是你想要的

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

有关示例,请参见常见问题解答。

简单的答案可能并不符合您的要求

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";
有关相关示例,请参见常见问题解答。

使用

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;

  $_;
}
要获得以下输出:

[* * *ab***c] 使用

要获得以下输出:

[* * *ab***c]
下面是一种基于您对所做评论的方法

输出:

* * * ab***c
下面是一种基于您对所做评论的方法

输出:

* * * ab***c
我相信这将比简单地为1..$n执行$string=~s/a/i/更有效;关于容易理解的问题,你可能是对的。但就使用s/a/i/for 1..$n的效率而言,将采用*m。使用拆分时会出现问题。这也避免了替换字符串与匹配表达式匹配时遇到的问题。我相信这比简单地使用$string=~s/a/i/for 1..$n更有效;关于容易理解的问题,你可能是对的。但就使用s/a/i/for 1..$n的效率而言,将采用*m。使用拆分时将出现。这也避免了替换字符串与匹配表达式匹配时遇到的问题。hi但当am替换为$s=abc时,我会遇到问题$s=~s{*}{*\n}表示1..2;打印$s;它将第一个*替换为\n,其余的将被忽略。。。为什么?*\如果我理解正确,你需要这样的短信:我的$I=0$str=~s/\*/+$i>$n$1:*\n/ge;您好,但当我用$s=abc替换时,我面临问题$s=~s{*}{*\n}表示1..2;打印$s;它将第一个*替换为\n,其余的将被忽略。。。为什么?*\如果我理解正确,你需要这样的短信:我的$I=0$str=~s/\*/+$i>$n$1:*\n/ge;你能再解释一下你在做什么吗?这里有点XY问题。告诉你,用你试图解决的实际问题,而不是你认为是答案的潜在解决方案你能再解释一下你在做什么吗?这里有点XY问题。告诉你,用你试图解决的实际问题,而不是你认为是答案的潜在解决方案输出实际上不是:[\n\nabc]吗?它将在每次迭代的第一个*匹配。我发布了可运行的工作代码。你不必相信我的话-输出实际上不是:[\n\nabc]吗?它将在每次迭代的第一个*匹配。我发布了可运行的工作代码。你不必相信我的话-