我有类似于下面显示的文本输入。我想在每个 'a=b' 模式之前添加单词 auto,但前提是它是关键字 kywrd 之后的序列的一部分(用分号分隔)。

kywrd a=b;c=d;
e=f;
fnctn z;
g=h;

所以我在这里寻找的输出是:
kywrd2 auto a=b;auto c=d;
auto e=f;
fnctn z;
g=h;

下面的 Perl6 (Raku?) 代码使用正则表达式添加 auto 关键字,但仅在第一个 a=b 模式之前。是否有一种简单的方法可以对序列中的所有模式执行替换;保留 g=h; 不变?

my Str $x = slurp "in.q";
$x ~~ s:g /kywrd\s+(\w+)\=(\w+)\;/kywrd2 auto $0=$1\;/;
spurt "out.q", $x;

最佳答案

将正则表达式保持在最低限度的一种可能方法:

sub repl ($input)
{
    $input.Str
    .split(';', :skip-empty)
    .map( 'auto ' ~ * ~ ';')
    .join('')
 };

 my $foo = 'kywrd a=b;c=d;d=e;';
 $foo ~~ s:g /kywrd \s+ (.+)/kywrds2 { repl($0) }/;
 $foo.say;

不过,我个人更喜欢 subst 形式的方法,而不是 s// 运算符。
$foo .= subst(/ kywrd \s+ (.+) /, "kywrds2 { repl($0) }", :g);

10-08 15:56