楽で `s ///`を連結する

Nov 30 2020

スクリプト中毒者がrakuに参加するための大きなセールスポイントは、そのような構成を可能にすることだと思います。

my $w = "Hello world"; $w
  ~~ s/Hello/Hola/
  ~~ s/world/mundo/
  ;

say $w; # » Hola world

しかし、私はこのようなものを書くことができないようです。私の知る限り、の.subst方法でこれを行うのStrは醜く、この連鎖、s///あるいはtr///基本的にはsedユーザーなどのゲートウェイドラッグになるでしょう。

私の質問は、何かが足りないのか、これに似た何かがラクでどういうわけか可能かどうかです。私は初心者ではないので、理解できませんでした。

回答

24 wamba Nov 30 2020 at 07:45

あなたは使用することができますwithまたはgiven

with $w {
    s/Hello/Hola/;
    s/world/mundo/;
}

andthen

$w andthen  s/Hello/Hola/ && s/world/mundo/;

またはこの醜い構造

$_ := $w;
s/Hello/Hola/;
s/world/mundo/;
6 jubilatious1 Nov 30 2020 at 23:41

これまでのいくつかの優れた回答(コメントを含む)。

Rakuの非破壊S///演算子を利用すると、複数の(連続した)置換を行うときに役立つことがよくあります。楽REPLでは:

> my $w = "Hello world"; Hello world > given $w {S/Hello/Hola/ andthen S/world/mundo/};
Hola mundo
> say $w;
Hello world

コードに満足したら、結果を新しい変数に割り当てることができます。

> my $a = do given $w {S/Hello/Hola/ andthen S/world/mundo/}; Hola mundo > say $a
Hola mundo

この考えをもう少し進めて、次の「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;

HTH。

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