需要帮助来理解带有 /d 的 perl tr 命令

Need help in understanding perl tr command with /d

我在网上看到了以下 Perl 示例。

#!/usr/bin/perl 

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

print "$string\n";

结果:

b b   b.

有人可以解释一下吗?

/d表示delete

像这样 tr 是很不寻常的,因为它令人困惑。

tr/a-z//d

将删除所有 'a-z' 个字符。

tr/a-z/b/ 

会将所有 a-z 个字符音译为 b

这里发生的事情是——因为你的音译没有在每一侧映射相同数量的字符——任何映射的都被删除。

所以你有效地做的是:

tr/b-z//d;
tr/a/b/;

例如将所有 a 音译为 b,然后删除任何其他内容(空格和点除外)。

举例说明:

use strict;
use warnings;
my $string = 'the cat sat on the mat.';
$string =~ tr/the/xyz/d;

print "$string\n";

警告:

Useless use of /d modifier in transliteration operator at line 5.

并打印:

xyz cax sax on xyz max.

如果将其更改为:

#!/usr/bin/perl 
use strict;
use warnings;
my $string = 'the cat sat on the mat.';
$string =~ tr/the/xy/d;

print "$string\n";

你得到的是:

xy cax sax on xy max.

因此:t -> xh -> ye 刚被删除。

d用于删除找到但未被替换的字符。

要删除不在匹配列表中的字符,可以通过将 d 附加到 tr 运算符的末尾来完成。

#!/usr/bin/perl 

my $string = 'my name is serenesat';
$string =~ tr/a-z/bcd/d;
print "$string\n";

打印:

 b  b

删除字符串中不匹配的字符,只替换匹配的字符(a替换为b)。