How can I replace multiple whitespace with a single space in Perl?

Why is this not working?

$data = "What    is the STATUS of your mind right now?";

$data =~ tr/ +/ /;

print $data;

Answers


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;

Need Your Help

MVVM load data during or after ViewModel construction?

data-binding constructor viewmodel onload mvvm-light

My generic question is as the title states, is it best to load data during ViewModel construction or afterward through some Loaded event handling?

SQL Transaction was deadlocked

sql-server exception stored-procedures triggers

Sometimes I get this kind of exception on not very busy SQL server: