freeX: Tips & Tricks

Die ausschließlichen Vertriebsrechte an diesem Artikel liegen beim Computer- & Literaturverlag (C&L). Der Artikel darf nicht kopiert oder gar erneut in einer Zeitschrift oder einem Buch veröffentlicht werden ohne vorherige Erlaubnis von C&L. Der Verlag gestattet freundlicherweise die Veröffentlichung auf diesen Seiten. Wer öfter auf diesen Hinweis trifft, sollte sich überlegen, die Zeitschrift freeX zu abonnieren.

Zeilenende entfernen

Textdateien sollten im Prinzip immer ein abschließendes Zeilenende enthalten. Das erleichtert das zeilenweise Arbeiten mit diesen Dateien. Wer viel mit fremdem Quellcode von Programmen zu tun hat, wird feststellen, daß einigen Dateien der abschließende Zeilenumbruch fehlt. Wenn nun eine solche Datei modifiziert werden soll und die Änderungen auf das wesentliche beschränkt werden sollen, findet man sich hin und wieder in der merkwürdigen Lage wieder, daß der eigene Editor einen abschließenden Zeilenumbruch anfügt, dieser jedoch nicht erwünscht ist.

Wenn nur wenig geändert werden soll und die Änderungen als Patch-Datei verteilt werden, stört das Anhängsel, mit dem »patch« den Zeilenumbruch an die Datei anfügt. Gesucht wird also eine Möglichkeit, den abschließenden Zeilenumbruch, und nur den wieder zu entfernen.

Da hilft Perl. Mit dem Befehl »chop« wird das letzte Zeichen des übergebenen Parameters (bzw. »$_« falls keiner angegeben wurde) entfernt. Wenn die Datei oder der Eingabestrom in einem Rutsch eingelesen wird und vor der Ausgabe das letzte Zeichen gelöscht wird, ist das Problem gelöst. Nichts leichter als das, wie folgendes Programm zeigt.


   while (<>) {
      $file .= $_;
   }

   chop $file;
   print $file;

Das läßt sich jedoch auch kürzer ausdrücken. Man kann Perl nämlich mitteilen, daß Dateien vollständig eingelesen werden sollen und nicht zeilenweise. Tatsächlich weiß Perl gar nicht, was Zeilen sind, sondern liest einfach bis zum ersten Zeichen, das in der speziellen Variable »$/« (Input Record Separator) gespeichert wird. Wenn diese Variable auf einen phantastischen Wert gesetzt wird, der in im Datenstrom nicht vorkommt, muß Perl die Datei am Stück einlesen. Damit man nicht für jeden Datenstrom untersuchen muß, welches Zeichen nicht enthalten ist, hat Perl den Wert »0777« (oktal für 511) für diesen Zweck reserviert. Das Programm von oben läßt sich also wie folgt abkürzen:


   $/ = 0777;
   while (<>) {
      chop;
      print;
   }

Auch das läßt sich weiter abkürzen, doch dazu muß es zuerst etwas aufgeblasen werden. Perl sieht eine Erweiterung des »while«-Konstrukts vor, so daß zusätzlich ein »continue«-Block angegeben werden darf, der nach einem Schleifendurchlauf ausgewertet wird, jedoch bevor die Bedingung (hier »<>«) erneut ausgewertet wird. Dieses ist im Prinzip vergleichbar mit dem dritten Ausdruck in einer »for«-Schleife, in der oft die Schleifenvariable hochgezählt wird. In diesem Block soll die "Zeile" ausgegeben werden, wodurch man folgendes Programm enthält.


   $/ = 0777;
   while (<>) {
      chop;
   } continue }
      print;
   }

Das kann nun weiter zusammengefaßt werden, denn als eine weitere Besonderheit wartet Perl mit einer Abkürzung für einfache Programme auf. Wenn der Parameter »-p« angegeben wird, dannfügt Perl automatisch die folgende Schleife um das angegebene Programm:

   LINE:
     while (<>) {
   	 ...             # your program goes here
     } continue {
   	 print or die "-p destination: $!\n";
     }

Das sieht dem obigen Programm schon sehr ähnlich, fehlen nur noch der »chop«-Befehl und die Korrektur der Variable »$/«. Für einfache Programme ist es nicht immer sinnvoll, ein echtes Perl-Skript zu schreiben, sondern es wird einfach mit »-e skript« in der Kommandozeile angegeben. Für das hier behandelte Problem wird daher »-e chop« verwendet.

Mit »-0ooo« wird der Input Record Separator als Oktalzahl in der Kommandozeile angegeben. Die Befehlszeile für das obige Programm sieht daher vollständig wie folgt aus:

   perl -0777 -p -e chop

Doch auch das ist noch nicht die kürzeste Form, denn Perl erlaubt es, die Argumente zusammenzufassen. die meisten Leerzeichen dürfen daher auch noch entfernt werden, wodurch schließlich die kürzeste Form mit

   perl -0777pechop

entsteht.

Martin Schulze
Quelle: freeX 2/03