Loop through global substitution

守給你的承諾、 提交于 2019-12-14 03:22:32

问题


$num = 6;
$str = "1 2 3 4";
while ($str =~ s/\d/$num/g)
{
    print $str, "\n";
    $num++;
}

Is it possible to do something like the above in perl? I would like the loop to run only 4 times and to finish with $str being 6 7 8 9.


回答1:


You don't need the loop: the /g modifier causes the substitution to be repeated as many times as it matches. What you want is the /e modifier to compute the substitution. Assuming the effect you were after is to add 5 to each number, the example code is as follows.

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

If you really wanted to substitute numbers starting with 6, then this works.

$num = 6;
$str = "1 2 3 4";
$str =~ s/\d/$num++/eg;
print "$str\n";



回答2:


You could with the match operator.

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

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

However, @TFBW's solution is probably what you want unless you're writing a tokenizer for a big parser. In a tokenizer, it would look more like:

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


来源:https://stackoverflow.com/questions/58054369/loop-through-global-substitution

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!