Perl: funkcja do przycinania wiodących i końcowych białych znaków ciągu

82

Czy istnieje funkcja wbudowana do przycinania wiodących i końcowych białych znaków, tak że trim(" hello world ") eq "hello world"?

Landon Kuhn
źródło
3
FYI: równość ciągów znaków w Perlu jest testowana przez operatora eq.
A. Rex
5
Trochę wyjaśnień na temat wszystkich odpowiedzi, które otrzymałeś: s/^\s+|\s+$//g;vs s/^\s*//; s/\s*$//;Ta ostatnia jest (nawet odrobinę) bardziej idiomatycznym sposobem na zrobienie tego, ponieważ w tym przypadku uruchomienie silnika wyrażeń regularnych jest w rzeczywistości szybsze niż alternacja. Możesz przeczytać więcej na ten temat w książce Jeffrey Friedl's Mastering Regular Expressions. (Chyba że zostało to naprawione w jakiejś nowszej wersji Perla, w takim przypadku ktoś proszę mnie poprawić!)
Hugmeir
4
Pochodząc z języka Java i .NET, jestem prawie zszokowany, że nie jest to wbudowane w język! DZIĘKUJE WSZYSTKIM!
Landon Kuhn
3
@ landon9720, wygląda to poniekąd: Scalar :: Util ma trim i jest rdzeniem od 5.7.3 - to jest 2002!
Hugmeir
3
Hugmeir, to źle, zobacz odpowiedź Ether .
daxim,

Odpowiedzi:

89

Oto jedno podejście wykorzystujące wyrażenie regularne:

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

Perl 6 będzie zawierał funkcję przycinania:

$string .= trim;

Źródło: Wikipedia

Mark Byers
źródło
5
Sprawdzam to mniej więcej raz w miesiącu. Szkoda, że ​​nie mogę za każdym razem go głosować.
kyle
82

Jest to dostępne w String :: Util za pomocą trimmetody:

Uwaga redaktora: String::Utilnie jest to podstawowy moduł, ale można go zainstalować z CPAN za pomocą [sudo] cpan String::Util.

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

wydruki:

ciąg to teraz „cześć”

Jednak łatwo jest zrobić to sam:

$str =~ s/^\s+//;
$str =~ s/\s+$//;
Eter
źródło
@ mklement0 ani nigdy nie będzie. Ale to nie ma znaczenia, ponieważ każdy powinien używać modułów z CPAN.
Ether,
2
dlaczego wszyscy powinni używać modułów z CPAN? Utrudnia to spójność podczas używania perla z Twojej dystrybucji Linuksa (debian, redhat, ubuntu) w połączeniu z ręcznie zainstalowanymi modułami CPAN. Znacznie lepiej, jeśli można coś zrobić w perlu za pomocą modułów, które są dostępne jako pakiety w dystrybucji Linuksa
Marki555
@ Marki555 moduły dostępne jako pakiety w twojej dystrybucji Linuksa pochodzą z CPAN - właśnie zostały przepakowane. Generalnie możesz zażądać spakowania określonego modułu, jeśli nie zostało to jeszcze zrobione (osoby zajmujące się debianem są szczególnie responsywne i pomocne).
Ether
1
Wiem, że są również z CPAN ... Tak, generalnie mogę poprosić o nowy pakiet dla Debiana, ale to nie pomoże mi w przypadku zainstalowanej stabilnej wersji Debiana ... dlatego wolę moduły pakietów, ale używam bezpośrednio CPAN, jeśli naprawdę potrzebne.
Marki555
4
@Ether Z całym szacunkiem, naprawdę doceniam fakt, że jest to moduł niezwiązany z rdzeniem. Ten post mówi o używaniu modułu zamiast dość prostego jednowierszowego wyrażenia regularnego. Jeśli moduł jest rdzeniem, byłbym na to znacznie bardziej otwarty. Jest to istotne w tym przypadku.
UncleCarl
26

Nie ma wbudowanej trimfunkcji, ale możesz łatwo zaimplementować własną, używając prostego podstawienia:

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

lub używając niedestrukcyjnych podstawień w Perlu 5.14 i nowszych:

sub trim {
   return $_[0] =~ s/^\s+|\s+$//rg;
}
Eugene Yarmash
źródło
3

Dla tych, którzy używają Text :: CSV, znalazłem ten wątek, a następnie zauważyłem w module CSV, że możesz go usunąć za pomocą przełącznika:

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

Logika jest odwrotna w tym sensie, że jeśli chcesz rozebrać, ustaw na 1. Idź do figury. Mam nadzieję, że to pomoże każdemu.

Douglas
źródło
2

Zastosuj: s/^\s*//; s/\s+$//;do tego. Lub użyj, s/^\s+|\s+$//gjeśli chcesz być fantazyjny.

Dirk-Willem van Gulik
źródło
2

Używam również pozytywnego spojrzenia w przód, aby przyciąć powtarzające się spacje w tekście:

s/^\s+|\s(?=\s)|\s+$//g
Shaun McDonald
źródło
-4

Nie, ale możesz użyć s///operatora podstawienia i \sasercji białych znaków, aby uzyskać ten sam wynik.

Philipa Pottera
źródło
To spowodowałoby usunięcie spacji między wyrazami, a nie tylko na końcach ciągu.
DarenW
@DarenW: zależy od tego, jak go używasz.
Philip Potter