Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Perl, how do I remove consecutive pairs of characters from a string?

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.

like image 236
perlfaq Avatar asked Dec 07 '10 12:12

perlfaq


1 Answers

(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
like image 183
2 revs, 2 users 92% Avatar answered Nov 15 '22 15:11

2 revs, 2 users 92%