Concaténation de `s ///` dans raku

Nov 30 2020

Je trouve qu'un énorme argument de vente pour les accros aux scripts pour rejoindre raku serait d'avoir de telles constructions possibles

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

say $w; # » Hola world

Cependant, je ne semble pas être capable d'écrire quelque chose comme ça. Autant que je sache, faire cela avec la .substméthode de Strserait trop moche, et ce chaînage s///ou même tr///fondamentalement serait une drogue de passage pour les sedutilisateurs, etc.

Ma question est de savoir si quelque chose me manque, si quelque chose de similaire à distance est possible d'une manière ou d'une autre dans raku. Je ne suis pas un débutant et je ne pouvais pas le comprendre.

Réponses

24 wamba Nov 30 2020 at 07:45

Vous pouvez utiliser withougiven

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

andthen

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

ou cette construction laide

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

Quelques excellentes réponses à ce jour (y compris des commentaires).

L'utilisation de l' S///opérateur non destructif de Raku est souvent utile lors de plusieurs substitutions (successives). Dans le Raku REPL:

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

Une fois que vous êtes satisfait de votre code, vous pouvez affecter le résultat à une nouvelle variable:

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

Prenant cette idée un peu plus loin, j'ai écrit le script de traduction suivant 'baby Raku' et l'ai sauvegardé sous Bello_Gallico.p6. C'est amusant de courir!

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