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 .subst
méthode de Str
serait trop moche, et ce chaînage s///
ou même tr///
fondamentalement serait une drogue de passage pour les sed
utilisateurs, 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