Nối `s ///` trong raku
Tôi thấy rằng một điểm bán hàng lớn cho những người nghiện kịch bản tham gia raku sẽ có những cấu trúc như vậy có thể
my $w = "Hello world"; $w
~~ s/Hello/Hola/
~~ s/world/mundo/
;
say $w; # » Hola world
Tuy nhiên tôi dường như không thể viết một cái gì đó như thế này. Theo như tôi biết làm điều này với .substphương pháp của Strsẽ quá xấu xí, và chuỗi s///hoặc thậm chí tr///về cơ bản cũng sẽ là một loại thuốc cửa ngõ cho sedngười dùng, v.v.
Câu hỏi của tôi là nếu tôi thiếu một cái gì đó, nếu một cái gì đó từ xa tương tự như thế này có thể bằng cách nào đó trong raku. Tôi không phải là người mới bắt đầu và tôi không thể hiểu được điều đó.
Trả lời
Bạn có thể sử dụng withhoặcgiven
with $w {
s/Hello/Hola/;
s/world/mundo/;
}
andthen
$w andthen s/Hello/Hola/ && s/world/mundo/;
hoặc công trình xấu xí này
$_ := $w;
s/Hello/Hola/;
s/world/mundo/;
Một số câu trả lời xuất sắc cho đến nay (bao gồm cả nhận xét).
Việc sử dụng S///toán tử không phá hủy của Raku thường hữu ích khi thực hiện nhiều lần thay thế (liên tiếp). Trong Raku REPL:
> my $w = "Hello world"; Hello world > given $w {S/Hello/Hola/ andthen S/world/mundo/};
Hola mundo
> say $w;
Hello world
Khi bạn hài lòng với mã của mình, bạn có thể gán kết quả cho một biến mới:
> my $a = do given $w {S/Hello/Hola/ andthen S/world/mundo/}; Hola mundo > say $a
Hola mundo
Tiếp cận ý tưởng này xa hơn một chút, tôi đã viết kịch bản dịch 'baby Raku' sau đây và lưu nó dưới dạng Bello_Gallico.p6. Thật là vui khi chạy!
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