Home
 

Perl - Practical Extraction and Report Language

Vorwort

Dieses Dokument bietet nur einen winzigen Einblick in die Sprache Perl; dafür gibt es ja schon genug Dokumentation. Vielmehr sollen hier die größten Stärken und Schwächen von Perl aufgezeigt werden, sodaß jeder selbst entscheiden kann, ob er sich die Sprache näher ansehen möchte oder es doch lieber bleiben läßt. Was hier speziell für Perl zugeschnitten wurde gilt mehr oder weniger auch für andere Script-Sprachen. Wem also zwar das Prinzip zusagt, nicht jedoch Perl selbst, sollte vielleicht einmal einen Blick auf eine andere Script-Sprache werfen.

Überblick

Perl ist eine sehr hoch entwickelte Programmiersprache. Ihre Wurzeln liegen hauptsächlich in der Programmiersprache C und diversen UNIX-Tools, wie zum Beispiel Bourne-Shell, sed, awk und grep. Sie ist sehr gut für kleine bis mittlere Projekte geeignet; für grössere Projekte sollte man besser auf C/C++ oder ähnliche Hochsprachen zurückgreifen (wie wir sehen werden fehlen in Perl so wichtige Dinge wie Datentypen und Deklaration). Insbesondere ist Perl für Textbearbeitung, was ja schon aus dem Namen hervorgeht, und Systemadministration geeignet. Perl ist Freeware, unterliegt aber den GPL Nutzungsrechten; daher ist auch der Source frei erhältlich. Dies hat zur Folge, daß Perl auf vielen Plattformen erhältlich ist.

Die Anfänge von Perl

Es began im Jahre 1986. Der UNIX-Programmierer Larry Wall mußte zu dieser Zeit viele Textdateien auswerten und Berichte darüber zusammenstellen; dafür verwendete er zunächst awk. Bald erkannte er jedoch, daß awk für diese Aufgabe nicht ausreicht. Anstatt jedoch für jedes Problem ein eigenes Programm zu schreiben entschloß er sich zur Entwicklung einer neuen Sprache und schrieb einen Interpreter dafür. Mit der Zeit gewann Perl sehr viel an Funktionalität; nach einigen Versionen unterstützte Perl die regulären Ausdrücke, die Signalbehandlung und die Netzwerkkommunikation.

Grundlagen für Perl

Perl ist für viele Programmierer schnell zu erlernen, da sich die Syntax an C und die Bourne-Shell anlehnt. Durch die einfache Struktur von Perl kann sich der Programmierer auf das Wesentliche beschränken.

So gibt es beispielsweise weder die Vorschrift noch die Möglichkeit eine Variable vor der ersten Benutzung zu deklarieren; es existiert nicht einmal eine Unterscheidung zwischen Variablentypen. Eine einfache Variable kann jeden beliebigen Inhalt, sei es eine Zeichenkette oder eine Zahl, aufnehmen. Es gibt nur folgende Unterscheidung zwischen den grundlegenden Datenstrukturen:

Skalar ("scalar") -- $name
Eine einfache Variable mit jedem beliebigen Inhalt
Feld ("array") -- @name
Eine Liste von Skalaren, die durch Zahlen indiziert werden
Assoziatives Feld ("associative arrays", auch "hash" genannt) -- %name
Eine Liste von Skalaren, die durch Skalare indiziert werden

Unterschieden werden die Variablen durch die Zeichen "$", "@" und "%", die zusammen mit dem eigentlichen Namen den Variablenbezeichner bilden. Die gesamte Speicherverwaltung geschieht dynamisch und automatisch. Variablen können somit beliebig gekürzt oder erweitert werden, ohne das sich der Programmierer darum kümmern muß! Die Variablengröße ist nur durch den virtuellen Speicher begrenzt. In der aktuellen Version 5 von Perl wurden Zeiger ("references") hinzugefügt, die in normalen Skalaren gespeichert werden. Desweiteren wurden auch objektorientierte Sprachelemente hinzugefügt. Dadurch können nun Perl-Zusatzmodule einfacher programmiert und verwendet werden. Gesammelt werden diese Module im CPAN ("Comprehensive Perl Archive Network"). Mehr Informationen zum reichhaltigen Modulangebot findet man unter http://www.perl.com/perl/info/cool_modules.html.

Dies wäre eigentlich die passende Stelle, um die Syntax von Perl genauer unter die Lupe zu nehmen. Dies überlasse ich allerdings den Autoren und verweise nur auf die perl-manpages und die Perl-Homepage. Trotzdem möchte ich einige Anmerkungen machen, die für das grundsätzliche Verständnis absolut erforderlich sind:

  • Wenn eine Variable nicht durch die Funktionen local() oder my() als beschränkt markiert werden sind sie allgemeingültig.
  • Eine Klammerung ist bei Funktionsaufrufen nicht notwendig.
  • Wenn nicht anders angegeben arbeiten viele Operationen auf der Standardvariable "$_".

Eines der wichtigsten und unverständlichsten Sprachmittel in Perl sind die regulären Ausdrücke ("regular expressions"). Sie dienen zur Mustererkennung in einem Text. Auch diese möchte ich hier nicht näher behandeln.

Ein kleines Beispiel

Das folgende Beispielprogramm passwd1.pl liest aus der Datei "/etc/passwd" die entsprechenden Einträge aus und schreibt diese formatiert auf die Standardausgabe:

# Formatangabe für STDOUT, Titelzeile
format STDOUT_TOP =
                        Passwd File
Name                       Login      Uid   Gid Home
------------------------------------------------------------------
.

# Formatangabe für STDOUT, normale Zeile   
format STDOUT =
@<<<<<<<<<<<<<<<<<<<<<<<<< @||||||| @>>>> @>>>> @<<<<<<<<<<<<<<<<<

$user_name,            $login_name, $uid, $gid, $directory
.

open(P, "/etc/passwd");
while(<P>) {        # Eine Zeile aus dem Filehandle P lesen;
		    # liefert true, wenn eine Zeile gelesen werden konnte
    chomp;  # Zeilenumbruch entfernen

    # Einträge der Passwd aufspalten (siehe passwd(1), chfn(1))
    ($login_name, $passwd, $uid, $gid, $user_name, $directory, $shell)=split(/:/,$_, 7);
    ($user_name)=split(/,/,$user_name); # Behalte von den Benutzerinfos nur den Namen

  # BLOCK if EXPR
    write if $user_name;
}
close(P);

Die beiden Formatangaben "STDOUT_TOP" und "STDOUT" legen das Ausgabeformat für die Standardausgabe und die Funktion write() fest. "STDOUT_TOP" wird nur am Anfang jeder Seite ausgegeben, "STDOUT" legt jeweils eine Zeile fest. Ein Format besteht aus Paaren von Zeilen: In der ersten Zeile legt man fest wie etwas ausgegeben werden soll, in der zweiten Zeile was ausgegeben wird; beendet wird ein Format mit "." (siehe perlform(1) manpage). Betrachten wir nun die wichtigste Zeile dieses kleinen Scripts:

Durch while(<P>) { wird folgende Situation beschrieben: Lies die Datei "P" Zeilenweise ein, schreibe die Zeile nach $_ und führe den folgenden Block aus; tue dies, solange Zeilen in der Datei "P" existieren.

($login_name, $passwd, $uid, $gid, $user_name, $directory, $shell)=split(/:/,$_, 7);

Der Ausdruck split(/:/,$_, 7) bedeutet: "Spalte den Inhalt der Variable $_ bei jedem auftreten eines ':' auf, aber höchstens 7 mal". Diese Funktion liefert ein Feld zurück. Durch die Form "(x1, x2, x3, ..., xN)" wird auch ein Feld charakterisiert, mit x1 als dem ersten Feldelement, x2 dem zweiten, usw.

Die zweite interessante Zeile ist write if $user_name;, was soviel bedeutet wie "Schreibe eine Formatzeile, wenn die Variable $user_name definiert und nicht leer ist". Diese Schreibweise ist nur eine Abkürzung für

if ($user_name) {
  write();
}

Eine wenig ausgefeilter ist das Beispiel passwd2.pl . Hier wird eine "Hash of Hashes" verwendet, um die Passwd-Einträge mit dem Benutzernamen als Schlüssel abzulegen. Danach werden die Daten, sortiert nach Benutzernamen, ausgegeben.

Der kleine Unterschied...

Heißt es eigentlich Perl-Programm oder Perl-Script? Unter dem Begriff "Programm" versteht man meist den kompilierten Maschinencode, unter "Script" den reinen Sourcecode, der bei jedem Aufruf neu übersetzt wird. Perl kompiliert und optimiert den Sourcecode bei jedem Aufruf im Speicher, auch wenn es sich für den Benutzer wie ein Interpreter verhält. Somit sind eigentlich beide Begriffe zulässig, auch wenn es fast immer Perl-Script heißt.

Auch zwischen "Perl" und "perl" gibt es einen feinen Unterschied: Larry Wall bezeichnet mit "Perl" die Programmiersprache und mit "perl" die Implementierung davon.

Zwischen Genie und Wahnsinn

Ein Perl-Script ist für einen Anfänger praktisch unlesbar: Total entrückte Bezeichner der Standardvariablen, verworrene Parameterübergabe an Funktionen, merkwürdige Bezeichnungen und Mehrdeutigkeiten von Variablen ("This may seem a bit weird, but that's okay, because it is weird.", aus der perl-manpage) und unsinnig anmutende Zeichenketten namens reguläre Ausdrücke. Wer gewillt ist diesen Preis zu bezahlen erhält eine geniale Programmiersprache in der kleine Probleme noch kleiner werden und Textbearbeitung zu einem Kinderspiel entartet.

Portierungen

Perl wurde auf eine Vielzahl von Plattformen portiert. Dazu gehören: UNIX und Derivate, Amiga, AOS, Atari, LynxOS, Mac, MS-DOS, MVS, NetWare, Windows95 und Windows NT, OS/2, QNX, VMS, Xenix.
Diese Liste erhebt keinen Anspruch auf Vollständigkeit.

Quellen

URLs

Newsgroups

  • comp.lang.perl.announce
  • comp.lang.perl.misc
  • comp.lang.perl.modules
  • comp.lang.perl.tk
  • de.comp.lang.perl

Bücher

Programming Perl (bekannt als "Camel Book"):
Autoren: Larry Wall, Tom Christiansen, und Randal Schwartz
ISBN 1-56592-149-6      (Englisch)
ISBN 0-937175-64-1      (Deutsch?)
ISBN 4-89052-384-7      (Japanisch :-)