perl6 Одновременные замены с s ///? - PullRequest
0 голосов
/ 04 сентября 2018

Есть ли способ сделать одновременные замены с s ///? Например, если у меня есть строка с числом 1, 2, 3 и т. Д., И я хочу заменить 1 на «Том», 2 на «Мэри» и 3 на «Джейн» и т. Д.

my $a = "13231313231313231";
say $a ~~ s:g/1/tom/;
say $a ~~ s:g/2/mary/;
say $a ~~ s:g/3/jane/;

Есть ли хороший способ сделать все 3 шага одновременно?

Спасибо !!!

lisprog

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Для замен, подобных вашему примеру, вы можете использовать trans. Укажите список того, что нужно искать, и список замен:

my $a = "13231313231313231";
$a .= trans(['1','2','3'] => ['tom', 'mary', 'jane']);
say $a; 
tomjanemaryjanetomjanetomjanemaryjanetomjanetomjanemaryjanetom

Для простых строк вы можете упростить кавычки:

$a .= trans(<1 2 3> => <tom mary jane>);
0 голосов
/ 04 сентября 2018

Самый простой способ это, вероятно, сделать карту ваших замен и затем ссылаться на нее.

my $a = "123123";
my $map = Map.new(1 => "tom", 2 => "mary", 3 => "jane"); 
$a ~~ s:g/\d/$map{$/}/; 
say $a
"tomemaryjanetommaryjane"

Если вы хотите отобразить только определенные значения, вы можете обновить свой матч, конечно:

my $a = "12341234";
my $map = Map.new(1 => "tom", 2 => "mary", 3 => "jane"); 
$a ~~ s:g/1 || 2 || 3/$map{$/}/; 
say $a
"tomemrayjane4tommaryjane4"
...