【问题标题】:perl6 Simultaneous substitutions with s///?perl6 与 s/// 的同时替换?
【发布时间】:2018-09-04 03:36:56
【问题描述】:

有没有办法用 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/;

有没有同时完成所有 3 个步骤的好方法?

谢谢!!!

lisprog

【问题讨论】:

  • 注意:您的变量分配当前已损坏。我不能建议编辑,因为它太小了。应该是my $a = "等等
  • 谢谢你!剪切和粘贴,我错过了“=”符号。谢谢。

标签: substitution raku simultaneous


【解决方案1】:

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

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

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

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

【讨论】:

  • 几个小时前我有一个像你一样的答案,但后来被它的许多皱纹转移了。也许这就是你写“简单替换”的原因?它也适用于复杂的替换。例如,您可以在 LHS 上列出正则表达式。但总的来说trans DWEM。我刚刚制作了 DWEM。它会为这个评论做。 DWEM 类似于 DWIM,但 I 是专家。 Imo trans doc 在初读时是不透明的。它似乎也很不完整。我正在研究一个试图涵盖trans 的要点。如果我完成了,我会在此处添加一个链接作为评论。
【解决方案2】:

制作替换地图然后引用它的最简单方法。

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"

【讨论】:

  • 非常感谢西蒙!!!我想像你的答案,但我想知道为什么我当时似乎有精神障碍:-) 谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多