I have a string containing pairs of characters and I would like to replace each run by a single character. How can I do that?
This is a question from the official FAQ. We're importing the perlfaq to Stack Overflow.
(This is the official perlfaq answer, minus any subsequent edits)
You can use the substitution operator to find pairs of characters (or runs of characters) and replace them with a single instance. In this substitution, we find a character in (.)
. The memory parentheses store the matched character in the back-reference \g1
and we use that to require that the same thing immediately follow it. We replace that part of the string with the character in $1
.
s/(.)\g1/$1/g; # 5.10 or later
s/(.)\1/$1/g; # earlier versions
We can also use the transliteration operator, tr///
. In this example, the search list side of our tr///
contains nothing, but the c option complements that so it contains everything. The replacement list also contains nothing, so the transliteration is almost a no-op since it won't do any replacements (or more exactly, replace the character with itself). However, the s
option squashes duplicated and consecutive characters in the string so a character does not show up next to itself
my $str = 'Haarlem'; # in the Netherlands
$str =~ tr///cs; # Now Harlem, like in New York
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With