perl6用s ///同时替换?

lis*_*tor 8 simultaneous substitution perl6

有没有办法用s ///同时进行替换?例如,如果我有一个带有1s,2s,3s等数字的字符串,我想用"tom"代替1,用"mary"替换2,用"jane"代替3,等等?

my $a = "13231313231313231";
say $a ~~ s:g/1/tom/;
say $a ~~ s:g/2/mary/;
say $a ~~ s:g/3/jane/;
Run Code Online (Sandbox Code Playgroud)

有没有一个好方法一次完成所有3个步骤?

谢谢 !!!

lisprog

Cur*_*mes 15

对于像您的示例那样的替换,您可以使用trans.提供要搜索的内容列表和替换列表:

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

对于简单的字符串,您可以使用单词引用简化:

$a .= trans(<1 2 3> => <tom mary jane>);
Run Code Online (Sandbox Code Playgroud)

  • 几个小时前,我有一个像你一样排队的答案,但后来被它的许多皱纹所牵制.也许这就是你写"简单替换"的原因?它也适用于复杂的替代品.例如,您可以在LHS上列出正则表达式.但总的来说是"trans"DWEM.我刚刚做了DWEM.它会做这个评论.DWEM就像DWIM,但*I*是专家.Imo [`trans` doc](https://docs.perl6.org/routine/trans)在第一次阅读时是不透明的.它似乎也很不完整.我正在努力试图涵盖`trans`.如果我完成它,我会在这里添加一个链接作为评论. (3认同)
  • 11小时后... https://gist.github.com/raiph/a9d58825662b5cf2da2cc550cb3c6989 (3认同)

Sci*_*mon 7

最简单的方法是制作替代地图,然后引用它.

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

如果您只想映射某些值,您可以更新您的匹配当然:

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