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

70

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

  • 3
    К вашему сведению: равенство строк в Perl проверяется оператором eq .
  • 4
    Немного разъяснений по всем полученным ответам: s/^\s+|\s+$//g; vs s/^\s*//; s/\s*$//; Последний (хотя и немного) более идиоматичный способ сделать это, так как запуск двигателя регулярного выражения на самом деле быстрее, чем чередование, в данном случае. Вы можете прочитать больше об этом на регулярных выражениях Джеффри Фридла. (Если это не было исправлено в какой-то более новой версии Perl, в этом случае, пожалуйста, поправьте меня!)
Показать ещё 4 комментария
Теги:

10 ответов

79

Это доступно в 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";

печатает:

Строка

теперь "hello"

Однако достаточно легко сделать сам:

$str =~ s/^\s+//;
$str =~ s/\s+$//;
  • 0
    @ mklement0 и никогда не будет. Но это не актуально, поскольку все должны использовать модули из CPAN.
  • 1
    почему все должны использовать модули из CPAN? Это затрудняет согласованность при использовании perl из вашего дистрибутива linux (debian, redhat, ubuntu) в сочетании с установленными вручную модулями CPAN. Намного лучше, если что-то можно сделать в perl с использованием модулей, которые доступны в виде пакетов в дистрибутиве Linux.
Показать ещё 3 комментария
70

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

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

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

$string .= trim;

Источник: Wikipedia

  • 3
    Я смотрю это примерно раз в месяц. Жаль, что я не могу каждый раз поднимать это.
26

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

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

или используя неразрушающую замену в Perl 5.14 и более поздних версиях:

sub trim {
   return $_[0] =~ s/^\s+|\s+$//rg;
}
9

В соответствии с этот поток perlmonk:

$string =~ s/^\s+|\s+$//g;
8
3

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

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

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

3

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

s/^\s+|\s(?=\s)|\s+$//g
2

Один параметр Text::Trim:

use Text::Trim;
print trim("  example  ");
2

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

-4

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

  • 0
    Это уберет пробелы между словами, а не только с обоих концов строки.
  • 0
    @ ДаренВ: зависит от того, как вы его используете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню