Как я могу найти и заменить совпадение определенное количество раз в строке в Perl? - PullRequest
1 голос
/ 29 января 2010

Как найти и заменить совпадение определенное количество раз, используя s///;. Например:

$string="abcabdaaa";

Я хочу заменить a на i в $string n раз. Как я могу это сделать? n - целое число, предоставленное пользователем.

Ответы [ 6 ]

9 голосов
/ 29 января 2010

Простой ответ, вероятно, не хочет, чтобы вы хотели.

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

См. FAQ, Как изменить N-е вхождение чего-либо? для соответствующих примеров.

6 голосов
/ 29 января 2010

Просто подставьте $ n раз:

$string =~ s/a/i/ for 1..$n;

Это сделает это.
Более общим решением будет глобальная замена счетчиком:

my $i = 0; # count the substitutions made
$string =~ s/(a)/ ++$i > $n ? $1 : "i" /ge; 
4 голосов
/ 29 января 2010

Вы можете попробовать это:

$str1=join('i',split(/a/,$str,$n));
4 голосов
/ 29 января 2010

Я не знаю ни одного флага, который бы это сделал. Я бы просто использовал цикл:

for (my $i = 0; $i < $n; $i++)
{
   $string =~ s/a/i/;
}
1 голос
/ 17 марта 2010

Вот способ сделать это на основе комментария, который вы сделали к eugene y's answer

#!/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
0 голосов
/ 29 января 2010

Использование

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...