Thiemo Mättig

Perl, Einleitung und Programmstrukturen

Teil 1 des Vortrages, erarbeitet von Michael Möller, vorgetragen am 14.06.2000.

Geschichte

  • 1986 Beginn der Entwicklung
  • Entwickler: Larry Walls
  • Aufgabenstellung: diverse, in den USA verteilte Rechner administrieren und konfigurieren
  • Ergebniss: "Practical Extraction and Report Language" => Perl
  • andere Deutung der Abkürzung: "Pathologically Eclectic Rubbish Lister"
  • 18.10.1987 - Perl 1.0 wurde veröffentlicht (usenet: comp.sources)
  • Lizenz: seit Perl 3.0 GNU, zusätzlich seit 4.0 Perl Artistic License
  • Aktuelle Version: Perl 5.6

Was ist Perl?

  • Interpreter
  • Script-Sprache
  • anweisungsorientiert
  • Syntax ähnlich C
  • Perl ist eine Interpretersprache, die optimiert ist willkürliche Textdateien zu durchsuchen, aus ihnen Informationen zu filtern und Berichte aus diesen Informationen zu erstellen. Außerdem eignet sich Perl sehr gut für fast alle Aufgaben der Systemsteuerung. Die Sprache soll praktischen Nutzen bringen (leicht nutzbar, effizient, vollständig) und nicht unbedingt schön sein. Perl kombiniert die besten Eigenschaften von C, sed, awk, und sh. "Sprachhistoriker" werden ebenso Anleihen an csh, Pascal und sogar Basic-plus feststellen. (Larry Walls)

Einsatzgebiete

  • Systembetreuung/Systemverwaltung
    • Auswertung von Logfiles (Suche nach Unregelmäßigkeiten, Systemfehler, Hinweise auf Angriffsversuche)
    • Konfiguration (Automatisierung von Systemeinstellungen durch Auswertung und Änderung der Konfigurationsdateien)
    • ...
  • Dynamische HTML-Seiten (CGI-Scripte)
  • ...

Vor- und Nachteile

  • Vorteile
    • leicht zu erlernen, da Syntax C-ähnlich
    • universell einsetzbar
    • Vielzahl von unterstützten Plattformen
    • kurzer, effizienter Code
    • Code kann sehr kryptisch sein -> Sicherung des eigenen Arbeitsplatzes ;)
  • Nachteile
    • kryptischer Code möglich, kein Zwang zur strukturierten Programmierung
    • nur Interpreter

Unterstützte Plattformen

  • Unix (AIX, HP-UX, IRIX, Sienix, Tru64 Unix, Linux, FreeBSD, NetBSD, ...)
  • MS-DOS
  • Windows 95, 98, NT, 2000
  • MacOS
  • Amiga
  • BeOS
  • NextOS
  • VMS
  • OS/2
  • AS400
  • OS/390
  • ...

Buchempfehlungen, Verweise

  • Perl-Dokumentation in Englisch: www.perl.com
  • CGI-Scripte mit Perl: SelfHTML
  • Das Einsteigerseminar PERL. Thorsten Roßner
    BHV, Kaarst-Büttgen, ISBN: 3828710328
  • Einführung in PERL. Randal L. Schwartz, Tom Christiansen
    O'Reilly/VVA, ISBN: 389721105X
  • Programmieren mit Perl. Larry Wall, Tom Christiansen, Randal L. Schwartz
    O'Reilly/VVA, ISBN: 3930673487

Variablen

  • keine Variablentypen vorhanden!
  • Beispiele entnommen aus SelfHTML
  • normale Variablen
    • $Name = "Methusalem";
    • $Alter = 625;
  • Listen (Arrays)
    • @Daten = ("Jana",23,"Berlin","Abitur");
    • print $Daten[0], " ist ", $Daten[1], " Jahre alt, wohnt in ", $Daten[2], " und hat ", $Daten[3];
  • assoziative Listen (Hashes)
    • %Daten = ("Name","Jana","Alter",23,"Ort","Berlin");
    • print $Daten{'Name'}, " ist ", $Daten{'Alter'}, " Jahre alt und wohnt in ", $Daten{'Ort'};
  • Referenzen (Zeiger)
    • &A();
    • sub B() {
        print $$TextReferenz, "\n";
        # Wert ist nur noch in der Referenz enthalten!
      }
    • sub A() {
        my $Text = "Das ist ein kleiner Text";
        $TextReferenz = \$Text; # Hier wird eine Referenz definiert
        &B();
      }
  • Vordefinierte Variablen
    • Perl enthält viele vordefinierte Variablen, z.B: $_, $. und $]
    • if($] < 5)
        { die "Perl-Interpreter zu alt"; }
      else {
        while() { print $_; }
        print $., " Zeilen gelesen";
        close(DATEI);
      }
    • Eine vollständige Liste ist in SelfHTML zu finden.

Schleifen und bedingte Anweisungen

  • Ähnliche Befehle wie in C
  • if/unless/else/elsif
  • while/until
  • do..while/until
  • for/foreach
  • Sprungbefehle: goto, redo, next, last

Dateioperationen

  • open/close
    • #!/usr/bin/perl
      open(NEUIGKEITENDATEI, "<news.txt"); # Datei zum Lesen öffnen
      close(NEUIGKEITENDATEI);
    • if(open(COUNTERDATEI, "<counter/counter.dat") == false)
        { print "Counter-Datei nicht gefunden\n"; }
    • open(COUNTERDATEI, "<counter/counter.dat") || die "Counter-Datei nicht gefunden\n";
  • Modus beim Öffnen:
    • "<datei" zum Lesen
    • ">datei" zum Schreiben
    • ">>datei" zum anhängenden Schreiben
    • "+>datei" zum gleichzeitigen Lesen und Schreiben
    • "|datei" zur Ausführung eines Befehles
  • Beispielprogramm im Quelltext

Reguläre Ausdrücke in Perl

Teil 2 des Vortrages, erarbeitet von Mathias Mirle.

Allgemeines zu regulären Ausdrücken

  • Der Ausdruck /text/ sucht nach Text.
  • Der text kann sich aus Strings und Variablen zusammen setzen.
  • Groß- und Kleinschreibung wird streng unterschieden.
  • Sonderzeichen mit \ markieren, damit sie nicht interpretiert werden. Das betrifft zum Beispiel \ | ( ) [ ] { } $ * + - ? . und ^
  • Auswahl zwischen zwei Möglichkeiten mit |, zum Beispiel /A|B/
  • Auswahl zwischen mehreren Möglichkeiten mit [], zum Beispiel /[AB]/
  • [ABCDEF] kann auch als [A-F] geschrieben werden
  • Das Zeichen ^ negiert einen Bereich, /[^A-Z]/ deckt beispielsweise alle Zeichen außer den Großbuchstaben ab.

Bereiche (Zeichen mit Sonderbedeutung)

  • \d = [0-9]
  • \D = [^0-9]
  • \w = [A-Za-z0-9]
  • \W = ^\w
  • \s = [\r\t\n\f]
  • \S = ^\s
  • . = alles außer \n
  • \r = LF (Zeilenvorschub)
  • \t = Tabulator
  • \n = CR (Wagenrücklauf, unter Unix entspricht das dem Return)
  • \f = FF (Seitenvorschub)
  • \x00 bis \xFF = Zeichen ist als Hexadezimalwert angegeben
  • * = Das Suchmuster ist 0 bis n mal vorhanden, /[A-Z]*/ sucht z.B. nach beliebig langen Wörtern, die nur aus Großbuchstaben bestehen.
  • + = Das Suchmuster ist 1 bis n mal vorhanden, /[A-Z]+/ sucht z.B. nach Wörtern, die mindestens ein Zeichen lang sind.
  • ? = Das Suchmuster ist optional, /[\+\-]?\d+(,\d*)?/ sucht z.B. nach Zahlen, die optional ein Vorzeichen und Kommastellen enthalten dürfen.
  • Die Länge des Wortes in {} angeben, weil * und + unendlich sein dürfen.
    • {a,b} findet Muster der Länge a bis b
    • {,b} findet Muster, die höchstens b Zeichen lang sind
    • {a} findet nur Muster, die genau a Zeichen lang sind

Weitere Sonderzeichen

  • \A = Anfang des Strings
  • \Z = Ende des Strings
  • ^ = Anfang der Zeile, /^[A-Z]/ sucht z.B. nach beliebigen Buchstaben am Zeilenanfang.
  • $ = Ende der Zeile
  • \b = Wortgrenze, liegt zwischen \W und \w

Zwischenspeicher

  • Zwischenspeicher mit (), z.B. /(\w+)\s*(.*)/
  • Speicherung in $1 bis $9 oder mehr
  • Soll ein gefundener String im regulären Ausdruck selbst verwendet werden, dann schreibt man nicht $1 sondern \1, zum Beispiel /(\w+)\s*\1/

Suchen und ersetzen

  • Suchen und ersetzen mit s/.../.../, z.B. sucht s/Haallo/Hallo/ nach "Haallo" und ersetzt es durch "Hallo".
  • s/(\w+)\s*\1/$1/ sucht das doppelte Vorkommen eines Wortes und ersetzt es durch ein einfaches Wort.
  • Bindung an Variable mit =~ (entspricht einem "true") oder !~ (entspricht einem "false")
  • Ohne Variable mit $_ =~ ...

Weitere Optionen

  • /text/qimosx oder s/.../.../eqimosx
  • q ... globale Suche
  • i ... ignoriere Groß-/Kleinschreibung
  • m ... Strings aus mehreren Zeilen
  • o ... Muster nur einmal kompilieren, spart Zeit
  • s ... Strings als einzelne Zeile
  • x ... erweiterte reguläre Ausdrücke
  • e ... evaluiert den ersetzten Ausdruck, wird als Perl-Code abgearbeitet

x ... erweiterte reguläre Ausdrücke

  • (?#...) Kommentar
  • (?:...) Gruppierung ohne Speicherung
  • (?=...) überprüft, ob ... folgt, ohne es zu speichern
  • (?!...) überprüft, ob ... nicht folgt
  • (?imsx) setzt für Bereich entsprechenden Schalter

Unterprogramme

  • sub <name> { ... }
  • Es ist egal, an welcher Stelle im Code ein Unterprogramm eingefügt wird.
  • Parameter werden in Perl-Unterprogrammen als Liste @_ verwaltet.
  • Der Rückgabewert wird aus der letzten verwendeten Variable genommen, oder man gibt ihn explizit mit return variable an (vorzeitiger Abbruch).
  • Lokale Variablen mit local (in Ebene und darunter) oder my (nur in der Ebene des Unterprogrammes)

Module

  • require Modulname bindet ein zweites Perl-Programm nur ein, ohne zu prüfen, ob es vorhanden ist. Der Zugriff auf die Module erfolgt über ihren Modulnamen.
  • use Modulname lädt alles

Perl und CGI

Teil 3 des Vortrages, erarbeitet von Thiemo Mättig.

Was ist CGI?

  • Common Gateway Interface (Allgemeine Vermittlungsrechner-Schnittstelle, eine Schnittstellendefinition, zur Zeit wird Version 1.1 benutzt)
  • Schnittstelle zwischen Client und Webserver ("Client" ist der Browser des Anwenders)
  • Programmausführung auf Server
  • Client erhält dynamisch erzeugte Dokumente (zumeist HTML, aber auch GIF etc.)
  • vollkommen unabhängig vom Client (er sieht das CGI-Skript nie)

Anwendungsmöglichkeiten

  • dynamische Internetseiten
  • wenn Daten des Servers genutzt werden
  • z.B. Suchmaschinen, Datenbanken, Passwortabfragen, Gästebücher, erweiterbare Linklisten, Diskussionsforen, geprüfte Formulareingaben, virtueller Einkaufswagen, ...

Was hat CGI mit Perl zu tun?

  • CGI-Anwendungen unabhängig von Sprache
    • z.B. C, C++, Java, Python, ... (sogar Shellskripte)
  • Perl ist jedoch vorteilhaft
    • einfach (so einfach wie BASIC, funktionell C sehr ähnlich)
    • mächtige String-Funktionen
    • reguläre Ausdrücke
    • gute CGI-Anbindung
    • frei erhältlich
    • betriebssystemunabhängig (da es immer Quellcode ist)

Nachteile von CGI

  • vielgenutzte Skripte sind schnell überlastet (weil der Server alle Programme ausführt)
  • Perl muss erst interpretiert werden
  • kein Cachen in Proxy-Servern möglich

Erstes Beispiel

  • #!/usr/bin/perl
    print "Content-type: text/html\n\n";
    print "<html><body>Hello World!</body></html>\n";
  • $HOME/public_html/cgi-bin/skript.cgi (oder auch .../cgi-local/skript.pl)
  • ausführbar machen
  • http://www.inf.hs-zigr.de/~user01/cgi-bin/skript.cgi

HTTP

  • Hyper Text Transfer Protocol (das Übertragungsprotokoll)
  • Anfrage von Client an Server
  • Dokument vom Server zum Client

Client schickt Anfrage

  • Formular
  • <form action="cgi-bin/skript.cgi" method=get>
    Name: <input name="Name" size=50>
    Antwort: <input name="Antwort" size=50>
    <input type=submit value="Formulardaten absenden">
    </form>
  • Methode GET
    • http://www.server.de/cgi-bin/skript.cgi?Name=F%F6rn+Meier&Antwort=Ja
  • Methode POST
    • http://www.server.de/cgi-bin/skript.cgi (direkte Datenübertragung)
  • andere Möglichkeiten: Links, Images, SSI, Refresh

Server empfängt Anfrage

  • Methode GET
    • Umgebungsvariable (Maximallänge beträgt 255 Zeichen)
    • $Formulardaten = $ENV{'QUERY_STRING'};
  • Methode POST
    • Standardeingabe (die Länge wird aus einer Variablen gelesen)
    • read(STDIN, $Formulardaten, $ENV{'CONTENT_LENGTH'});
  • Weitere Eingabedaten
    • Textdateien, Datenbanken (auf dem Server)
    • Umgebungsvariablen, z.B. REMOTE_ADDR (auch SERVER_*, SCRIPT_*, HTTP_*)

Server verarbeitet Anfrage

  • $Formulardaten = "Name=J%F6rn+Meier&Antwort=Ja"
  • @Formularfelder = split(/&/, $Formulardaten);
    foreach $Feld (@Formularfelder) {
      ($name, $value) = split(/=/, $Feld);
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $FORM{$name} = $value;
    }
  • assoziatives Array: $FORM{'Name'} = "Jörn Meier"

Server fragt Datenquellen ab

  • open(FILEHNDL,"filename") || die("Can't open file\n");
    $Textzeile = <FILEHNDL>;
    chop $Textzeile;
    close(FILEHNDL);
  • $sqlanfrage = "SELECT daten FROM tabelle WHERE name = $FORM{'Name'};";
    $dbproc = &dblogin("Userid", "Password");
    &dbuse($dbproc, "DatenbankName");
    &dbcmd($dbproc, $sqlanfrage);
    &dbsqlexec($dbproc);
    &dbresults($dbproc);
    while ($zeile = &dbnextrow($dbproc)) {push(@gesamt, $zeile);}
    &dbexit();

Server schickt Antwort

  • Standardausgabe
    • print("Content-type: text/html\n\n");
    • print "<html>\n"; (sogar inklusive Zeilenumbrüche)
    • print qq!<body text="#FF0000">\n!; (anstatt des " wird hier ein ! verwendet)
  • weitere Ausgaben in Dateien (Textdateien und Datenbanken auf dem Server)

Client empfängt Antwort

  • genau wie jedes normale Dokument
  • Content-type: text/html
  • ebenfalls üblich: text/plain, image/gif, image/x-xbitmap

Beispiele im Quelltext

Quellen