Concaténation de `s ///` dans raku
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
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/;
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