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!
@ 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:
eq
.s/^\s+|\s+$//g;
vss/^\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ć!)Odpowiedzi:
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:
Źródło: Wikipedia
źródło
Jest to dostępne w String :: Util za pomocą
trim
metody:Uwaga redaktora:
String::Util
nie 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:
Jednak łatwo jest zrobić to sam:
$str =~ s/^\s+//; $str =~ s/\s+$//;
źródło
Nie ma wbudowanej
trim
funkcji, 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; }
źródło
Według wątku tego perlmonka :
$string =~ s/^\s+|\s+$//g;
źródło
Wypełnij instrukcje w perfaq tutaj: http://learn.perl.org/faq/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning-end-of-a-string-
źródło
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.
źródło
Jedną z opcji jest Text :: Trim :
use Text::Trim; print trim(" example ");
źródło
Zastosuj:
s/^\s*//; s/\s+$//;
do tego. Lub użyj,s/^\s+|\s+$//g
jeśli chcesz być fantazyjny.źródło
Używam również pozytywnego spojrzenia w przód, aby przyciąć powtarzające się spacje w tekście:
s/^\s+|\s(?=\s)|\s+$//g
źródło
Nie, ale możesz użyć
s///
operatora podstawienia i\s
asercji białych znaków, aby uzyskać ten sam wynik.źródło