Re: Shellscript-Frage

From: Christian Lackas <c.lackas(at)kfa-juelich.de>
Date: Sat, 7 Dec 2002 13:59:34 +0100

* Matthias Fechner <idefix(at)fechner.net> [021207 12:13]:

Hallo Matthias,

> * Christian Lackas <c.lackas(at)kfa-juelich.de> [07-12-02 00:22]:
> > in Perl würdest du natürlich auch tr nehmen:
> > perl -pi.bak -e 'tr/ //s' dateiname
> > (legt auch noch ein Backup als »dateiname.bak« an).
> Aber nicht, wenn ich nur ein paar Leerzeichen in einer Variable
> ersetzen will und ein regexp ist zudem bestimt noch schneller oder
> liege ich da falsch?

dann würdest du

    $var =~ tr/ //s;

benutzen und das ist natürlich viel schneller als mit regulären
Ausdrücken und dem s/// Operator rumzuhantieren, da es nur mit echten
Zeichen arbeitet. Du kannst es ja mal ausprobieren:

    perldoc Benchmark

BTW: Hast du dein »$foo=~s/\s+/\s/g;« mal ausprobiert? Das wird nicht
wirklich das tun, was du vorhattest:

    perl -le '$_="Hallo\n Welt"; s/\s+/\s/g; print'

    HallosWelt

und nicht

    perl -le '$_="Hallo\n Welt"; tr/ //s; print'
    Hallo
     Welt

Zum einen steht \s für eine ganze Zeichenklasse (Leerzeichen, LineFeed,
CarriageReturn, FormFeed) ersetzt also mehr als du wolltest (z.B. auch
mehrere Leerzeilen); zum anderen kann es aus dem gleichen Grund auch
nicht auf der rechte Seite stehen (sprich: '\s' ist dort einfach 's').
Desweiteren braucht man einzelne Zeichen ja nicht nochmal zu ersetzen.
Das ergibt also insgesamt:

    $foo =~ s/ +/ /g;

Aber hier ist die Verwendung von tr/// nicht nur kürzer sondern auch
noch schneller, daher soll man darauf zurückgreifen.

Gruß
 Christian

-- 
Beim Griff in die eigene Tasche stellt man immer wieder fest,
daß die öffentliche Hand schon vorher drin war.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sat 07 Dec 2002 - 14:00:08 CET

search this site