Объединение `s ///` в раку

Nov 30 2020

Я считаю, что огромным преимуществом для любителей скриптов, присоединяющихся к raku, было бы наличие таких конструкций.

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

say $w; # » Hola world

Однако, похоже, я не могу написать что-то подобное. Насколько я знаю, делать это с помощью .substметода Strбыло бы слишком некрасиво, и эта цепочка s///или даже в tr///основном была бы средством доступа для sedпользователей и т. Д.

Мой вопрос: если я чего-то упускаю, возможно ли что-то отдаленно похожее на это в raku. Я не новичок и так и не разобрался.

Ответы

24 wamba Nov 30 2020 at 07:45

Вы можете использовать withилиgiven

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

andthen

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

или эта уродливая конструкция

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

Пока есть отличные ответы (включая комментарии).

Использование неразрушающего S///оператора Raku часто бывает полезным при выполнении множественных (последовательных) замен. В Raku REPL:

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

Когда вы довольны своим кодом, вы можете присвоить результат новой переменной:

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

Развивая эту идею немного дальше, я написал следующий сценарий перевода «малыш Раку» и сохранил его как Bello_Gallico.p6. Бегать весело!

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