Aus LinuxUser 10/2001

The Answer Girl (Seite 2)

perlrun             Perl execution and options

sieht nach der Sektion aus, die wir brauchen, um mehr über Optionen zu erfahren, die das Debuggen erleichtern. Tatsächlich: man perlrun erklärt eine Option -w (wie „warnen“; Listing 1 gibt die Erläuterung auf deutsch wieder), die für unsere Absicherung geeignet scheint.

Listing 1

Was tut

perl -w

?

(Auszug aus der perlrun-Manpage, ins Deutsche übersetzt)

-w   warnt vor Variablennamen, die nur ein einziges Mal
      vorkommen und Skalar-Variablen, die benutzt werden,
      bevor sie überhaupt gesetzt wurden. Gibt des Weiteren
      Warnungen aus, wenn Subroutinen mehrfach definiert,
      nicht definierte Datei-Handles referenziert werden oder
      auf nur-lesbare Datei-Handles geschrieben werden soll.
      Weitere Warnungen gelten Werten, die als numerische Werte
      benutzt werden, aber keine Zahlen sind, Arrays, die
      wie Skalare benutzt werden, Subroutinen, die mehr als
      100 Mal rekursiv aufgerufen werden und unzähligen
      anderen Problemen.

Alles nur geklaut

Jetzt wollen wir viele Dateien bearbeiten, am besten alle, die im aktuellen Verzeichnis stehen. Sowas sollte doch auch schon vor uns jemand mal gemacht haben. Perl-Skripte gibt es auf dieser Welt und im WWW viele, das mit der verständlichen Dokumentation ist hingegen so eine Sache. Ein Lichtblick für Neu-Perlianer/innen ist Brigitte Jellineks „Perlwelt“ [2], die in kleinen, gut überschaubaren Perl-Skripten praktisch relevante Aufgaben löst.

Hier finden wir unter Viele Webseiten ändern[3] ein Skript, das in allen HTML-Dateien im aktuellen Verzeichnis die Umlaut-Entities in echte ISO-Umlaute umwandelt (Abbildung 1) und mit

$^I = ".bak";

zuvor sogar immer eine Backup-Datei mit der Endung .bak anlegt.

Abbildung 1: Abschreiben von Bjellis Perlwelt
Abbildung 1: Abschreiben von Bjellis Perlwelt

Dieses letzte Feature markieren wir zunächst einmal mit einem # am Zeilenanfang so, dass der Interpreter es nicht beachtet. Indem wir die Zeile auskommentieren, ergibt sich als netter Nebeneffekt, dass wir einstweilen noch gar keine Dateien schreiben, sondern das Ergebnis auf der Standardausgabe angezeigt bekommen. Zum Testen ohnehin viel besser!

In Perl beginnen einfache (skalare) Variablen immer mit einem Dollarzeichen, und eine so komische Variable wie $^I muss schlichtweg etwas Vordefiniertes sein. Tatsächlich erklärt man perlvar, dass damit das Inplace-Editing, also das Editieren der gerade bearbeiteten Datei ein- oder abgeschaltet wird.

Auch die nächste Zeile,

@ARGV = <*.html>;

sieht nach einer vordefinierten Variablen aus, wegen des vorangestellten @ ein Array, also ein ein- oder mehrdimensionales Wertefeld. @ARGV, der „Argumentvektor“, ist eindimensional und enthält laut der perlvar-Manpage die Kommandozeilenargumente des Skripts. Wir sind also sehr gewitzt und definieren erst innerhalb des Programms, mit welchen Argumenten es eigentlich aufgerufen wird: natürlich mit allen, die auf .html enden.

Perl sorgt bereits von sich aus dafür, dass die Argumentdateien geöffnet werden und man über das Handle<> Zugang zu den darin enthaltenen Daten bekommt. Wir müssen den Inhalt also lediglich zeilenweise abgreifen, bis es keine Zeilen mehr gibt:

while( $zeile = <> ) { }

Ein klarer Fall für eine Schleife, die immer wieder durchlaufen wird, solange (while) die in runden Klammern stehende Bedingung stimmt. Ob wir die zur Zwischenspeicherung benötigte Variable $zeile wie in [3] vorab mit der my()-Funktion deklarieren oder sie erst da entstehen lassen, wo wir sie brauchen, spielt bei Perl keine Rolle. Erst im Zusammenhang mit objektorientierter Perl-Programmierung wird my() wirklich wichtig. Allerdings schadet es nicht, sich von vornherein daran zu gewöhnen. Wenn wir den Inhalt von $zeile innerhalb der geschweiften Klammern mit

print $zeile;

wieder ausgeben, sollte unser Skript einfach den Inhalt der .html-Dateien im aktuellen Verzeichnis Zeile für Zeile ausgeben. Testen wir das in einem Verzeichnis, das (nicht zuviele) HTML-Files enthält. Da cgks vermutlich nicht im Suchpfad liegt, geben wir den Pfad mit an (z. B. den Punkt als Abkürzung für das aktuelle Verzeichnis).

pjung@chekov:~/answergirl$ ./cgks
 bash: ./cgks: No such file or directory

Keine Datei, kein Verzeichnis dieses Namens? Da ist etwas faul. Wir haben wohl vergessen, uns selbst mit chmod u+x cgks Ausführbarkeitsrechte zuzugestehen.

Muster erkennen

Da uns das Skript brav die Dateiinhalte ausgibt, können wir nun die Links raussuchen. Perl kennt das schöne Konstrukt der „per Default zu bearbeitenden Daten“, die sich in der Variablen $_ verstecken. Wenn man nach etwas sucht, braucht man gar nicht angeben, worin zu suchen ist, wenn man den Inhalt von $_ meint. Wir wollen den Inhalt von $zeile bearbeiten und legen ihn daher mit

LinuxUser 10/2001 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: