Łączenie `s ///` w raku

Nov 30 2020

Uważam, że ogromną zaletą dla uzależnionych od skryptów dołączających do raku byłoby posiadanie takich konstrukcji

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

say $w; # » Hola world

Jednak wydaje mi się, że nie jestem w stanie napisać czegoś takiego. O ile wiem, zrobienie tego .substmetodą Strbyłoby zbyt brzydkie, a to wiązanie, s///a nawet w tr///zasadzie, byłoby bramą dla sedużytkowników itp.

Moje pytanie brzmi, czy czegoś mi brakuje, czy coś na odległość podobnego jest jakoś możliwe w raku. Nie jestem początkującym i nie mogłem tego rozgryźć.

Odpowiedzi

24 wamba Nov 30 2020 at 07:45

Możesz użyć withlubgiven

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

andthen

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

lub ta brzydka konstrukcja

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

Jak dotąd kilka doskonałych odpowiedzi (w tym komentarze).

Wykorzystanie niedestrukcyjnego S///operatora Raku jest często przydatne podczas wykonywania wielu (kolejnych) podstawień. W REPL Raku:

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

Gdy będziesz zadowolony ze swojego kodu, możesz przypisać wynik do nowej zmiennej:

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

Idąc dalej z tym pomysłem, napisałem następujący skrypt tłumaczenia „małego Raku” i zapisałem go jako Bello_Gallico.p6. Fajnie jest biegać!

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