Pytanie Perl: funkcja do przycinania wiodących i kończących białych znaków


Czy istnieje wbudowana funkcja przycinania wiodących i końcowych spacji w taki sposób, że trim(" hello world ") eq "hello world"?


76
2018-01-04 20:10


pochodzenie


FYI: Równość łańcuchów w Perlu jest testowana przez operatora eq. - A. Rex
Trochę wyjaśnienia na temat wszystkich otrzymanych odpowiedzi: s/^\s+|\s+$//g; vs s/^\s*//; s/\s*$//; Ten drugi sposób jest (nieco mniej) bardziej idiomatyczny, ponieważ uruchomienie silnika regex jest w rzeczywistości szybsze niż alternacja. Możesz przeczytać więcej na ten temat w Mastering Regular Expressions Jeffrey Friedl. (O ile nie zostało to naprawione w jakiejś nowszej wersji Perla, w takim przypadku proszę mnie poprawić!) - Hugmeir
Pochodzę z tła Java i .NET, jestem prawie zszokowany, że nie jest wbudowany w język! DZIĘKUJE WSZYSTKIM! - Landon Kuhn
@ landon9720, w pewnym sensie jest to: Scalar :: Util ma wykończenie i jest rdzeniem od 5.7.3 - To jest 2002! - Hugmeir
Hugmeir, to jest złe, zobacz odpowiedź Eteru. - daxim


Odpowiedzi:


Jest to dostępne w String :: Util z trim metoda:

Komentarz edytora: String::Util nie jest modułem podstawowym, ale można go zainstalować CPAN z [sudo] cpan String::Util.

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

drukuje:

ciąg jest teraz "cześć"

Jednak łatwo to zrobić samemu:

$str =~ s/^\s+//;
$str =~ s/\s+$//;

80
2018-01-04 20:33



@ mklement0 ani nigdy nie będzie. Ale to nie ma znaczenia, ponieważ każdy powinien używać modułów z CPAN. - Ether
dlaczego wszyscy powinni używać modułów z CPAN? Utrudnia to konsystencję podczas korzystania z perla z dystrybucji linuxowej (debian, redhat, ubuntu) w połączeniu z ręcznie instalowanymi modułami CPAN. Znacznie lepiej, jeśli coś można zrobić w Perlu za pomocą modułów, które są dostępne jako pakiety w dystrybucji Linuksa - Marki555
@ Moduły Marki555 dostępne jako pakiety w dystrybucji Linuksa są z CPAN - właśnie zostały przepakowane. Zwykle możesz poprosić o spakowanie określonego modułu, jeśli nie zostało to już zrobione (osoby debian są szczególnie responsywne i pomocne). - Ether
Wiem, że są również z CPAN ... Tak, generalnie mogę poprosić o nowy pakiet dla debiana, ale to nie pomoże mi w moim zainstalowanym debian stabilnym wydaniu ... dlatego preferuję moduły pakietów, ale używaj bezpośrednio CPAN jeśli naprawdę potrzebne. - Marki555
@Ether Z całym szacunkiem, naprawdę doceniam fakt, że jest to moduł inny niż podstawowy. Ten post mówi o korzystaniu z modułu zamiast prostego jedno-liniowego wyrażenia regularnego. Jeśli moduł jest rdzeniem, byłbym o wiele bardziej otwarty. Jest to istotne w tym przypadku. - UncleCarl


Oto jedno podejście, używając wyrażenia regularnego:

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

Perl 6 będzie zawierał funkcję przycinania:

$string .= trim;

Źródło: Wikipedia


78
2018-01-04 20:13



Rozglądam się o tym raz w miesiącu. Szkoda, że ​​nie mogę tego zrobić za każdym razem. - kyle


Nie ma wbudowanego trim funkcja, ale możesz łatwo zaimplementować własną przy użyciu prostej zamiany:

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

lub za pomocą substytucja nieniszcząca w Perlu 5.14 i późniejszym:

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

26
2018-01-04 20:14





Według ten wątek perlmonk:

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

9
2018-01-04 20:13





Kompletne howto w perfaq tutaj: http://learn.perl.org/faq/perlfaq4.html#How-do-I-strip-blank-space- from-beginning-end-of-a-string-


8
2018-01-04 20:15





Używam również dodatniej uprzedniej do przycinania powtarzających się spacji w tekście:

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

3
2017-11-12 19:03





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

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

Logika jest wstecz w tym, jeśli chcesz usunąć, a następnie ustawić na 1. Idź, rysunek. Mam nadzieję, że to pomoże każdemu.


3
2017-12-03 16:44





Jedną z opcji jest Tekst :: Przytnij:

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

3
2018-01-22 19:30





Zastosować: s/^\s*//; s/\s+$//; do tego. Albo użyj s/^\s+|\s+$//g jeśli chcesz mieć ochotę.


2
2018-01-04 20:14





Nie, ale możesz użyć s/// operator zastępowania i \s twierdzenie whitespace, aby uzyskać ten sam wynik.


-4
2018-01-04 20:14



To usunie spacje między wyrazami, nie tylko na końcu łańcucha. - DarenW
@DarenW: zależy od tego, jak go używasz. - Philip Potter