Perl: функция для обрезки пробелов в начале и в конце строки

82

Есть ли встроенная функция для обрезки начальных и конечных пробелов, таких как trim(" hello world ") eq "hello world"?

Лэндон Кун
источник
3
К вашему сведению: равенство строк в Perl проверяется оператором eq.
A. Rex
5
Небольшое разъяснение по всем полученным вами ответам: s/^\s+|\s+$//g;vs s/^\s*//; s/\s*$//;Последний - ( хоть и немного) более идиоматический способ сделать это, поскольку запуск механизма регулярных выражений в этом случае на самом деле быстрее, чем чередование. Вы можете прочитать больше об этом в книге Джеффри Фридла «Освоение регулярных выражений». (Если это не было исправлено в какой-либо более новой версии Perl, и в этом случае кто-нибудь, пожалуйста, поправьте меня!)
Hugmeir
4
Исходя из опыта Java и .NET, я почти шокирован, что это не встроено в язык! СПАСИБО ВСЕМ!
Landon Kuhn
3
@ landon9720, это в некотором роде: Scalar :: Util имеет обрезку и является ядром с 5.7.3 - это 2002 год!
Hugmeir 04
3
Хугмейр, это неправильно, см. Ответ Эфира .
daxim 05

Ответы:

89

Вот один из подходов с использованием регулярного выражения:

$string =~ s/^\s+|\s+$//g ;     # remove both leading and trailing whitespace

Perl 6 будет включать функцию обрезки:

$string .= trim;

Источник: Википедия

Марк Байерс
источник
5
Я смотрю это примерно раз в месяц. Жаль, что я не могу голосовать каждый раз.
kyle
82

Это доступно в String :: Util с помощью trimметода:

Примечание редактора: String::Utilэто не основной модуль, но вы можете установить его из CPAN с помощью [sudo] cpan String::Util.

use String::Util 'trim';
my $str = "  hello  ";
$str = trim($str);
print "string is now: '$str'\n";

печатает:

строка теперь "привет"

Однако сделать это достаточно просто:

$str =~ s/^\s+//;
$str =~ s/\s+$//;
Эфир
источник
@ mklement0 и никогда не будет. Но это не актуально, так как все должны использовать модули из CPAN.
Ether
2
зачем всем использовать модули от CPAN? Это затрудняет согласованность при использовании perl из вашего дистрибутива Linux (debian, redhat, ubuntu) в сочетании с вручную установленными модулями CPAN. Гораздо лучше, если что-то можно будет сделать в Perl с использованием модулей, которые доступны в виде пакетов в дистрибутиве Linux
Marki555
Модули @ Marki555, доступные в виде пакетов в вашем дистрибутиве linux, взяты из CPAN - они только что были переупакованы. Как правило, вы можете запросить упаковку определенного модуля, если это еще не было сделано (сотрудники debian особенно отзывчивы и полезны).
Ether
1
Я знаю, что они также из CPAN ... Да, обычно я могу запросить новый pkg для debian, но это не поможет мне для моей установленной стабильной версии debian ... вот почему я предпочитаю модули пакетов, но использую напрямую CPAN, если действительно необходимо.
Marki555
4
@Ether При всем уважении, мне очень приятно знать, что это неосновной модуль. В этом посте говорится об использовании модуля вместо довольно простого однострочного регулярного выражения. Если модуль является основным, я был бы гораздо более открытым для него. Это актуально и в данном случае.
UncleCarl 01
26

Встроенной trimфункции нет, но вы можете легко реализовать свою, используя простую замену:

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;
}

или с помощью неразрушающей замены в Perl 5.14 и новее:

sub trim {
   return $_[0] =~ s/^\s+|\s+$//rg;
}
Евгений Ярмаш
источник
3

Для тех, кто использует Text :: CSV, я нашел этот поток, а затем заметил в модуле CSV, что вы можете отключить его с помощью переключателя:

$csv = Text::CSV->new({allow_whitespace => 1});

Логика обратная в том, что если вы хотите раздеться, вы устанавливаете значение 1. Пойдите и подумайте. Надеюсь, это кому-нибудь поможет.

Дуглас
источник
2

Применить: s/^\s*//; s/\s+$//;к нему. Или используйте, s/^\s+|\s+$//gесли хотите нарядиться.

Дирк-Виллем ван Гулик
источник
2

Я также использую позитивный взгляд вперед, чтобы обрезать повторяющиеся пробелы внутри текста:

s/^\s+|\s(?=\s)|\s+$//g
Шон Макдональд
источник
-4

Нет, но вы можете использовать s///оператор подстановки и \sутверждение пробела, чтобы получить тот же результат.

Филип Поттер
источник
Это удалит пробелы между словами, а не только на обоих концах строки.
DarenW
@DarenW: зависит от того, как вы его используете.
Филип Поттер