代码之家  ›  专栏  ›  技术社区  ›  lisprogtor

Perl6同时替换为s///?

  •  8
  • lisprogtor  · 技术社区  · 6 年前

    有没有一种方法可以同时替换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 回复  |  直到 6 年前
        1
  •  15
  •   Curt Tilmes    6 年前

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

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

    对于简单的字符串,可以通过引用单词来简化:

    $a .= trans(<1 2 3> => <tom mary jane>);
    
        2
  •  7
  •   Scimon Proctor    6 年前

    最简单的方法可能是绘制一张替换图,然后引用它。

    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"
    
    推荐文章