Menggabungkan `s ///` dalam raku

Nov 30 2020

Saya menemukan bahwa nilai jual yang sangat besar bagi pecandu skrip untuk bergabung dengan raku adalah memiliki konstruksi seperti itu

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

say $w; # » Hola world

Namun saya sepertinya tidak bisa menulis sesuatu seperti ini. Sejauh yang saya tahu melakukan ini dengan .substmetode Strakan terlalu buruk, dan rangkaian ini s///atau bahkan tr///pada dasarnya akan menjadi pintu gerbang obat bagi sedpengguna dll.

Pertanyaan saya adalah jika saya melewatkan sesuatu, jika sesuatu yang mirip dengan ini mungkin terjadi di raku. Saya bukan pemula dan saya tidak bisa memahaminya.

Jawaban

24 wamba Nov 30 2020 at 07:45

Anda bisa menggunakan withataugiven

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

andthen

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

atau konstruksi jelek ini

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

Beberapa jawaban bagus sejauh ini (termasuk komentar).

Memanfaatkan S///operator non-destruktif Raku seringkali berguna saat melakukan banyak pergantian (berturut-turut). Di Raku REPL:

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

Setelah Anda puas dengan kode Anda, Anda dapat menetapkan hasilnya ke variabel baru:

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

Mengambil ide ini sedikit lebih jauh, saya menulis skrip terjemahan 'baby Raku' berikut dan menyimpannya sebagai Bello_Gallico.p6. Sangat menyenangkan untuk dijalankan!

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