Verketten von `s ///` in Raku

Nov 30 2020

Ich finde, dass ein großes Verkaufsargument für Skriptsüchtige, sich Raku anzuschließen, darin besteht, solche Konstrukte möglich zu machen

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

say $w; # » Hola world

Ich scheine jedoch nicht in der Lage zu sein, so etwas zu schreiben. Soweit ich weiß, wäre es zu hässlich, dies mit der .substMethode von Strzu tun , und diese Verkettung von s///oder sogar im tr///Grunde wäre ein Gateway-Medikament für sedBenutzer usw.

Meine Frage ist, ob mir etwas fehlt, ob etwas Ähnliches in Raku irgendwie möglich ist. Ich bin kein Anfänger und konnte es nicht herausfinden.

Antworten

24 wamba Nov 30 2020 at 07:45

Sie könnten withoder verwendengiven

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

andthen

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

oder diese hässliche Konstruktion

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

Einige ausgezeichnete Antworten (einschließlich Kommentare).

Die Verwendung des zerstörungsfreien S///Operators von Raku ist häufig nützlich, wenn mehrere (aufeinanderfolgende) Ersetzungen durchgeführt werden. In der Raku REPL:

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

Sobald Sie mit Ihrem Code zufrieden sind, können Sie das Ergebnis einer neuen Variablen zuweisen:

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

Um diese Idee ein wenig weiter zu verfolgen, schrieb ich das folgende 'Baby Raku'-Übersetzungsskript und speicherte es als Bello_Gallico.p6. Es macht Spaß zu rennen!

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