Concatenando `s ///` em raku

Nov 30 2020

Eu acho que um grande ponto de venda para viciados em script ingressarem em raku seria ter tais construções possíveis

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

say $w; # » Hola world

No entanto, não pareço ser capaz de escrever algo assim. Pelo que eu sei, fazer isso com o .substmétodo de Strseria muito feio, e esse encadeamento s///ou até mesmo tr///basicamente seria uma porta de entrada para os sedusuários etc.

Minha pergunta é se estou faltando alguma coisa, se algo remotamente semelhante a isso é possível de alguma forma no raku. Não sou um novato e não consegui descobrir.

Respostas

24 wamba Nov 30 2020 at 07:45

Você pode usar withougiven

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

andthen

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

ou esta construção feia

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

Algumas respostas excelentes até agora (incluindo comentários).

Utilizar o S///operador não destrutivo de Raku costuma ser útil ao fazer substituições múltiplas (sucessivas). No Raku REPL:

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

Quando estiver satisfeito com seu código, você pode atribuir o resultado a uma nova variável:

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

Levando essa ideia um pouco mais longe, escrevi o seguinte script de tradução do 'baby Raku' e salvei como Bello_Gallico.p6. É 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