为什么tr / a-z / b / d替换perl?

时间:2014-10-10 22:05:31

标签: regex perl

为什么tr/a-z/b/d会替换perl中的字符a?是不是要删除a to z中的所有字符?

$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;

print "$string\n"; # => b b   b. Why?

3 个答案:

答案 0 :(得分:5)

来自documentation

  

如果使用/d修饰符,则REPLACEMENTLIST始终完全按照指定进行解释。否则,如果REPLACEMENTLIST比SEARCHLIST短,则复制最后一个字符直到它足够长。

由于您使用了/d修饰符,因此不会扩展REPLACEMENTLIST。因此,a会被b替换,而a-z匹配的其余字母会被删除,因为REPLACEMENTLIST中没有任何内容可以替换它们。

如果您在没有/d修饰符的情况下执行此操作,您将获得预期的行为。它等同于:

tr/a-z/bbbbbbbbbbbbbbbbbbbbbbbbbb/

因为复制。

答案 1 :(得分:4)

搜索列表为a-z。替换列表为b。选项/d已给出。这意味着将a替换为b,并删除所有其他没有替换的匹配项。文档here

答案 2 :(得分:3)

第二个范围比第一个范围短。所以a被b替换,b-z被空字符串替换,因为末尾有额外的d标志。