在 raku 中连接 `s///`

mar*_*ari 22 raku

我发现脚本成瘾者加入 raku 的一个巨大卖点就是拥有这样的结构

my $w = "Hello world";

$w
  ~~ s/Hello/Hola/
  ~~ s/world/mundo/
  ;

say $w; # » Hola world
Run Code Online (Sandbox Code Playgroud)

但是我似乎无法写出这样的东西。据我所知,用 的.subst方法做这件事Str太丑了,这种连锁 s///甚至tr///基本上也将成为sed用户等的入门药物。

我的问题是我是否遗漏了某些东西,如果在 raku 中以某种方式可能会出现与此类似的东西。我不是初学者,我无法弄清楚。

wam*_*mba 24

你可以使用 withgiven

with $w {
    s/Hello/Hola/;
    s/world/mundo/;
}
Run Code Online (Sandbox Code Playgroud)

andthen

$w andthen  s/Hello/Hola/ && s/world/mundo/;
Run Code Online (Sandbox Code Playgroud)

或者这个丑陋的建筑

$_ := $w;
s/Hello/Hola/;
s/world/mundo/;
Run Code Online (Sandbox Code Playgroud)

  • 使用 with,您还可以进行后修复以避免括号: `s/Hello/Hola/ && s/world/mundo/ with $w`。 (4认同)
  • 特别是,接下来的作品`echo hello world | raku -ne 's/hello/hola/; s/世界/世界/;.say'`这只是一个卖点,在乐社区中压力不足,恕我直言 (2认同)
  • 如果您可以将价值提升到主要主题,@margolari jubilatious1 的建议就很好。但如果没有,您可以使用缩减运算符来删除更多字符:`[&&] s///,s///,s///,... with $foo`。 (2认同)

jub*_*us1 6

到目前为止一些优秀的答案(包括评论)。

S///在进行多次(连续)替换时,利用 Raku 的非破坏性 运算符通常很有用。在 Raku REPL 中:

> my $w = "Hello world";
Hello world
> given $w {S/Hello/Hola/ andthen S/world/mundo/};
Hola mundo
> say $w;
Hello world
Run Code Online (Sandbox Code Playgroud)

一旦您对代码感到满意,就可以将结果分配给一个新变量:

> my $a = do given $w {S/Hello/Hola/ andthen S/world/mundo/};
Hola mundo
> say $a
Hola mundo
Run Code Online (Sandbox Code Playgroud)

进一步考虑这个想法,我编写了以下“baby Raku”翻译脚本并将其保存为Bello_Gallico.p6. 跑起来很有趣!

my $caesar = "Gallia est omnis divisa in partes tres";
my $trans1 = do given $caesar {
 S/Gallia/Gaul/ andthen
 S/est/is/ andthen
 S/omnis/a_whole/ andthen
 S/divisa/divided/ andthen
 S/in/into/ andthen
 S/partes/parts/ andthen
 S/tres/three/ 
};
put $caesar;
put $trans1;
Run Code Online (Sandbox Code Playgroud)

哈。

https://docs.raku.org/language/regexes#S///_non-corruption_substitution

  • 这也非常有用,而且看起来也不错“sedish”! (2认同)
  • @margolari 就像我用 wamba 展示的那样,用这个,因为 `andthen` 是一个中缀运算符而不是控制字,你也可以做 `my $trans1 = [andthen] S///, S///, S/// ... $caesar` 是非破坏性的:-) (2认同)