perl6用s ///同时替换?

时间:2018-09-04 03:36:56

标签: substitution perl6 simultaneous

有没有办法用s ///同时进行替换?例如,如果我有一个包含数字1、2、3等的字符串,并且我想用“ 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/;

有没有一种好的方法可以一次完成所有三个步骤?

谢谢!!!

lisprog

2 个答案:

答案 0 :(得分:15)

对于类似示例的替换,您可以使用trans。提供搜索内容列表和替换列表:

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

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

$a .= trans(<1 2 3> => <tom mary jane>);

答案 1 :(得分:7)

创建替换图然后引用它的最简单方法。

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"