Цикл глобальной замены - PullRequest
       3

Цикл глобальной замены

0 голосов
/ 23 сентября 2019
$num = 6;
$str = "1 2 3 4";
while ($str =~ s/\d/$num/g)
{
    print $str, "\n";
    $num++;
}

Возможно ли сделать что-то подобное в Perl?Я бы хотел, чтобы цикл запускался только 4 раза и закончился с $str, равным 6 7 8 9.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

Вам не нужен цикл: модификатор / g заставляет замену повторяться столько раз, сколько она совпадает.Вам нужен модификатор / e для вычисления подстановки.Предполагая, что эффект, который вы получили после этого, заключается в добавлении 5 к каждому числу, пример кода выглядит следующим образом:

$str = "1 2 3 4";
$str =~ s/(\d)/$1+5/eg;
print "$str\n";

Если вы действительно хотите заменить числа, начинающиеся с 6, то это работает.

$num = 6;
$str = "1 2 3 4";
$str =~ s/\d/$num++/eg;
print "$str\n";
0 голосов
/ 23 сентября 2019

Вы могли бы с оператором сопоставления.

my $new_str = '';
while ($str =~ /\G(.*?)\d/gc) {
   $new_str .= $1 . $num++;
}

$new_str .= substr($str, pos($str));

Однако решение @ TFBW, вероятно, то, что вам нужно, если вы не пишете токенизатор для большого парсера.В токенизаторе это будет выглядеть примерно так:

# So we don't have to say «$str =~ all» over the place.
# Also, allows us to use redo.
for ($str) {
   /\G \s+ /xgc;   # Skip whitespace.

   if (/\G (\d+) /xgc) {
      # Do something with $1.
      redo;
   }

   ...

   last if /\G \z /xgc;

   die "Unrecognized token";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...