Как я могу заменить несколько пробелов одним пробелом в Perl? - PullRequest
12 голосов
/ 02 октября 2010

Почему это не работает?

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

$data =~ tr/ +/ /;

print $data;

Ответы [ 3 ]

29 голосов
/ 02 октября 2010

Используйте $data =~ s/ +/ /; вместо.

Пояснение:

tr - это оператор translation . Важно отметить, что модификаторы регулярных выражений не применяются в операторе перевода (за исключением -, который по-прежнему указывает диапазон). Поэтому, когда вы используете
tr/ +/ / вы говорите: "Возьмите каждый экземпляр пробела и + и переведите их в пробел". Другими словами, tr рассматривает пробел и + как отдельные символы, не регулярное выражение.

Демонстрация:

$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?"

Использование s делает то, что вы ищете, говоря: «сопоставьте любое количество последовательных пробелов (хотя бы один экземпляр) и замените их одним пробелом». Вы также можете использовать что-то вроде
s/ +/ /g; если есть несколько мест, где вы хотите, чтобы произошла замена (g означает глобальное применение).

12 голосов
/ 02 октября 2010

Вы также можете использовать tr с опцией «squash», которая удалит дублирующиеся замененные символы.Подробнее см. perlop .

my $s = "foo      bar   fubb";
$s =~ tr/ //s;
7 голосов
/ 05 октября 2010

В Perl 5.10 появился новый класс символов, \h, обозначающий горизонтальный пробел, который хорош для такого рода вещей:

 $s =~ s/\h+/ /g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...