Why is this not working?
$data = \"What is the STATUS of your mind right now?\";
$data =~ tr/ +/ /;
print $data;
Use $data =~ s/ +/ /;
instead.
Explanation:
The tr
is the translation operator. An important thing to note about this is that regex modifiers do not apply in a translation statement (excepting -
which still indicates a range). So when you use
tr/ +/ /
you're saying "Take every instance of the characters space and +
and translate them to a space". In other words, the tr
thinks of the space and +
as individual characters, not a regular expression.
Demonstration:
$data = "What is the STA++TUS of your mind right now?";
$data =~ tr/ +/ /;
print $data; #Prints "What is the STA TUS of your mind right now?"
Using s
does what you're looking for, by saying "match any number of consecutive spaces (at least one instance) and substitute them with a single space". You may also want to use something like
s/ +/ /g;
if there's more than one place you want the substitution to occur (g
meaning to apply globally).
You can also use tr
with the "squash" option, which will remove duplicate replaced characters. See perlop for details.
my $s = "foo bar fubb";
$s =~ tr/ //s;
Perl 5.10 has a new character class, \h
, the stands for horizontal whitespace which is nice for this sort of thing:
$s =~ s/\h+/ /g;