Search code examples
perltranslate

Need help in understanding perl tr command with /d


I came across the following Perl example on the web.

#!/usr/bin/perl 

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

print "$string\n";

result:

b b   b.

Can someone please explain how ?


Solution

  • /d denotes delete.

    It's quite unusual to do a tr like that because it's confusing.

    tr/a-z//d
    

    would delete all 'a-z' characters.

    tr/a-z/b/ 
    

    would transliterate all a-z characters to b.

    What's happening here though is - because your transliteration doesn't map an equal number of character on each side - anything that doesn't map is deleted.

    So what you're effectively doing is:

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

    E.g. transliterating all the as to bs and then deleting anything else (except spaces and dots).

    To illustrate:

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

    Warns:

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

    and prints:

    xyz cax sax on xyz max.
    

    If you change that to:

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

    You get instead:

    xy cax sax on xy max.
    

    And thus: t -> x and h -> y. e just gets deleted.