Concatenando `s ///` en raku

Nov 30 2020

Encuentro que un gran punto de venta para los adictos a los scripts para unirse a raku sería tener tales construcciones posibles

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

say $w; # » Hola world

Sin embargo, parece que no puedo escribir algo como esto. Por lo que sé, hacer esto con el .substmétodo Strsería demasiado feo, y este encadenamiento de s///o incluso tr///básicamente también sería una droga de entrada para los sedusuarios, etc.

Mi pregunta es si me falta algo, si algo remotamente similar a esto es posible de alguna manera en raku. No soy un principiante y no pude entenderlo.

Respuestas

24 wamba Nov 30 2020 at 07:45

Podrías usar withogiven

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

andthen

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

o esta fea construcción

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

Algunas respuestas excelentes hasta ahora (incluidos comentarios).

La utilización del S///operador no destructivo de Raku suele ser útil cuando se realizan sustituciones múltiples (sucesivas). En Raku REPL:

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

Una vez que esté satisfecho con su código, puede asignar el resultado a una nueva variable:

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

Llevando esta idea un poco más lejos, escribí el siguiente guión de traducción 'baby Raku' y lo guardé como Bello_Gallico.p6. ¡Es divertido correr!

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