Menggabungkan `s ///` dalam raku
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 .subst
metode Str
akan terlalu buruk, dan rangkaian ini s///
atau bahkan tr///
pada dasarnya akan menjadi pintu gerbang obat bagi sed
pengguna 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
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/;
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