Perl: Funktion zum Trimmen von führenden und nachfolgenden Leerzeichen

80

Gibt es eine eingebaute Funktion, um führende und nachfolgende Leerzeichen so zu kürzen, dass trim(" hello world ") eq "hello world"?

Landon Kuhn
quelle
3
Zu Ihrer Information: Die Zeichenfolgengleichheit in Perl wird vom Bediener getestet eq.
A. Rex
5
Ein bisschen Klarstellung zu allen Antworten, die Sie erhalten haben: s/^\s+|\s+$//g;vs s/^\s*//; s/\s*$//;Letzteres ist die (etwas) idiomatischere Methode, um dies zu tun, da das Starten der Regex-Engine in diesem Fall tatsächlich schneller ist als der Wechsel. Weitere Informationen hierzu finden Sie in Jeffrey Friedls Mastering Regular Expressions. (Es sei denn, dies wurde in einer neueren Version von Perl behoben. In diesem Fall korrigiert mich bitte jemand!)
Hugmeir
4
Ich komme aus Java und .NET und bin fast schockiert, dass dies nicht in die Sprache integriert ist! DANKE ALLEN!
Landon Kuhn
3
@ landon9720, es ist etwas: Scalar :: Util hat Trimm und ist Kern seit 5.7.3 - Das ist 2002!
Hugmeir
3
Hugmeir, das ist falsch, siehe die Antwort von Ether .
Daxim

Antworten:

87

Hier ist ein Ansatz mit einem regulären Ausdruck:

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

Perl 6 wird eine Trimmfunktion enthalten:

$string .= trim;

Quelle: Wikipedia

Mark Byers
quelle
5
Ich schaue das ungefähr einmal im Monat nach. Schade, dass ich es nicht jedes Mal positiv bewerten kann.
Kyle
82

Dies ist in String :: Util mit der folgenden trimMethode verfügbar :

Anmerkung des Herausgebers: String::Utilist kein Kernmodul, aber Sie können es von CPAN mit installieren [sudo] cpan String::Util.

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

Drucke:

Zeichenfolge ist jetzt "Hallo"

Es ist jedoch einfach genug, sich selbst zu tun:

$str =~ s/^\s+//;
$str =~ s/\s+$//;
Äther
quelle
@ mklement0 noch wird es jemals sein. Dies ist jedoch nicht relevant, da jeder Module aus dem CPAN verwenden sollte.
Ether
2
Warum sollte jeder Module von CPAN verwenden? Dies erschwert die Konsistenz, wenn Sie Perl aus Ihrer Linux-Distribution (Debian, Redhat, Ubuntu) in Kombination mit manuell installierten CPAN-Modulen verwenden. Es ist viel besser, wenn etwas in Perl mit Modulen gemacht werden kann, die als Pakete in der Linux-Distribution verfügbar sind
Marki555
@ Marki555-Module, die als Pakete in Ihrer Linux-Distribution verfügbar sind, stammen von CPAN - sie wurden gerade neu verpackt. Sie können im Allgemeinen das Packen eines bestimmten Moduls anfordern, wenn dies noch nicht geschehen ist (die Debian-Leute sind besonders reaktionsschnell und hilfreich).
Ether
1
Ich weiß, dass sie auch von CPAN stammen ... Ja, im Allgemeinen kann ich ein neues Paket für Debian anfordern, aber es hilft mir nicht für meine installierte stabile Debian-Version ... Deshalb bevorzuge ich Paketmodule, verwende aber direkt CPAN, wenn wirklich gebraucht.
Marki555
4
@Ether Bei allem Respekt schätze ich es sehr zu wissen, dass dies ein Nicht-Kernmodul ist. In diesem Beitrag geht es um die Verwendung eines Moduls anstelle eines ziemlich einfachen Regex-Einzeilers. Wenn das Modul Kern ist, wäre ich viel offener dafür. Dies ist in diesem Fall relevant.
OnkelCarl
26

Es gibt keine eingebaute trimFunktion, aber Sie können Ihre eigene einfach mit einer einfachen Ersetzung implementieren:

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

oder zerstörungsfreie Substitution in Perl 5.14 und höher verwenden:

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

Für diejenigen, die Text :: CSV verwenden, habe ich diesen Thread gefunden und dann im CSV-Modul festgestellt, dass Sie ihn über den Schalter entfernen können:

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

Die Logik ist insofern rückwärts, als Sie, wenn Sie sich entfernen möchten, auf 1 setzen. Hoffe das hilft jedem.

Douglas
quelle
2

Bewerben: s/^\s*//; s/\s+$//;darauf. Oder verwenden s/^\s+|\s+$//gSie, wenn Sie Lust haben möchten.

Dirk-Willem van Gulik
quelle
2

Ich verwende auch einen positiven Lookahead, um sich wiederholende Leerzeichen im Text zu kürzen:

s/^\s+|\s(?=\s)|\s+$//g
Shaun McDonald
quelle
-4

Nein, aber Sie können den s///Substitutionsoperator und die \sWhitespace-Zusicherung verwenden, um das gleiche Ergebnis zu erzielen.

Philip Potter
quelle
Das würde Leerzeichen zwischen Wörtern entfernen, nicht nur an beiden Enden der Zeichenfolge.
DarenW
@DarenW: hängt davon ab, wie Sie es verwenden.
Philip Potter