Reputation: 101
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 ?
Upvotes: 8
Views: 1742
Reputation: 53498
/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 a
s to b
s 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.
Upvotes: 9
Reputation: 4709
d
is used to delete found but not replaced characters.
To remove the characters which are not in the matching list can be done by appending d
to the end of the tr
operator.
#!/usr/bin/perl
my $string = 'my name is serenesat';
$string =~ tr/a-z/bcd/d;
print "$string\n";
Prints:
b b
Not matching characters in the string is removed, and only the matching character replaced (a
replaced with b
).
Upvotes: 3