Einleitung
Sprachkonstrukte
Module
CGI Anwendung
CGI.pm Modul
eine interpretierte Sprache,
für Erschließung, Aufbereitung und Neuformatierung
beliebiger Textdateien
kann C
, sed
,
awk
und sh
ersetzen
überwindet alle Beschränkungen dieser Sprachen
Perl von Lary Wall entwickelt, Version 5.0.
Auch Pathologically Eclectic Rubbish Lister
Perl Dateien haben Endung .pl
.
Ausführung mit
perl tuwas.pl
Unter UNIX andere Variante:
#!/usr/bin/perl
#
Unix Kommentar,
!
der Name eines Kommandointerpreters folgt
/usr/bin/
ist eine Pfadangabe,
Kurzes Beispiel:
Frage nach dem Namen und Ausgabe von "Hallo, ... !
"
(1) #!perl (2) print "Wie ist dein Name ? "; (3) $name = <STDIN>; (4) chop($name); (5) print "Hallo, $name !\n";
der Kontext in dem ein Literal oder eine Variable verwendet wird, wird durch die verwendeten Operatoren erzwungen.
Beispiel
"33" + "44"
ergibt Zahl77
33 . 44
ergibt Zeichenkette"3344"
'abc'
wie q/abc/
, keine Interpolation
"abc"
wie qq/abc/
, mit Interpolation
`COMMAND`
wie qx/COMMAND/
,
Ausführung eines externen Kommandos
Beispiel: Arrays, Felder
@fred = (11,22,33); @barney = @fred;
auch mit dem qw/.../
Operator
@fred = qw/11 22 33/;
Beispiel: assoziatives Array
%fred = (1,22,'h',33,"\t",44); %barney = %fred;
auch mit dem =>
Operator
%fred = (1 => 22, 'h' => 33, "\t" => 44);
Beispiel: Skalare
print $fred[2] + $fred{'h'};
ergibt 33+33
= 66
Skalar-Kontext
print @fred * %fred;
ergibt 3*3
= 9
Statements,
z.B. Zuweisungen VAR = EXPR;
Folgen von Statements { ... }
,
Statements immer mit Semikolon abgeschlossen
sub name BLOCK;
Funktionen werden mit dem Schlüsselwort sub
definiert. Zum Aufruf von Funktionen wird &name
verwendet.
sub unter { local($a,$b) = @_; return "Das Ergebnis ist " . ( $a*$b ) . " wie gewünscht"; } print "\n" . &unter(6,7) . ".\n\n"; Das Ergebnis ist 42 wie gewünscht.
if (EXPR) BLOCK [ elsif (EXPR) BLOCK ... [ else BLOCK ] ];
Im Gegensatz zu C müssen nach if (EXPR)
immer
geschweifte Klammern { }
stehen.
unless (EXPR) BLOCK [ else BLOCK ];
Wie if (NOT EXPR)
.
while (EXPR) BLOCK;
for (EXPR; EXPR; EXPR) BLOCK;
Die For-Schleife ist wie in C.
foreach VAR (ARRAY) BLOCK;
Beispiel: foreach $a (@fred) { print "$a\n"; };
EXPR || die "Reason";
Falls die Auswertung von EXPR
fehlschlägt
wird das Perl Program abgebrochen.
Reason
wird auf STDERR
ausgegeben.
Nach der Auswertung der Ausdrücke EXPR
bedeuten die leere Zeichenkette ""
,
"0"
und 0
false;
alle anderen Werte bedeuten true
(z.B. auch "00"
).
VAR =~ m/reg-expr/;
Sucht nach dem regulären Ausdruck reg-expr
in der Variablen VAR
.
VAR =~ s/old/new/;
Substituiert den Ausdruck old
durch den Ausdruck new
in der Variablen VAR
.
VAR =~ tr/a-z/A-Z/;
Ersetzt die entsprechenden Zeichen
in der Variablen VAR
, d.h.
b
wird durch B
ersetzt usw.
OBJREF -> METHOD(PARAMETERS);
Aufruf der Methode METHOD
mit den Parametern PARAMETERS
des Objekts OBJREF
.
VAR = OBJECT -> new(PARAMETERS);
Erzeugen einer neuen Objektreferenz in
VAR
des Objekts OBJECT
.
Dateien, Pipes und Filehandles.
open( FILEHANDLE, "name" );
open( FILEHANDLE, "<name" );
Öffnet die Datei name
zum lesen.
open( FILEHANDLE, ">name" );
(Erzeugt und) öffnet die Datei name
zum (über)schreiben.
open( FILEHANDLE, ">>name" );
Öffnet die Datei name
zum schreiben,
der alte Inhalt bleibt erhalten.
open( FILEHANDLE, "+<name" );
Öffnet die Datei name
zum lesen und schreiben.
open( FILEHANDLE, "+>name" );
(Erzeugt und) öffnet die Datei name
zum lesen und schreiben.
open( FILEHANDLE, "+>>name" );
(Erzeugt und) öffnet die Datei name
zum lesen und schreiben, der alte Inhalt bleibt erhalten.
open( FILEHANDLE, "|name" );
Startet das Programm name
und
öffnet eine Pipe zum schreiben auf
STDIN
dieses Programms.
open( FILEHANDLE, "name|" );
Startet das Programm name
und
öffnet eine Pipe zum lesen von
STDOUT
dieses Programms.
close( FILEHANDLE );
<FILEHANDLE>
Liefert die nächste Zeile der Datei.
print( FILEHANDLE, EXPR );
Schreibt auf die Datei FILEHANDLE
,
ohne FILEHANDLE
wird auf STDOUT
geschreiben.
read( FILEHANDLE, VAR, LENGTH );
Liest LENGTH
Bytes von Datei FILEHANDLE
in die Variable VAR
.
Zusammen mit HTML überflüssig.
format FILEHANDLE = fieldline_1 valueline_1 fieldline_n valueline_n .
Definiert ein Printformat für die Datei FILEHANDLE
.
fieldline_i
definiert das Aussehen einer Zeile und
valueline_i
listet alle Werte und Variablen, die
ausgegeben werden sollen.
Zum Beispiel durch das Format
format STDOUT = @#### @<<<<< @||||| @>>>>> $a, $b, $b, $b .
wird die Ausgabe der Werte der Variablen $a
und $b
auf STDOUT
definiert.
Dabei wird $a
als Zahl
in einem Feld der Länge 5 formatiert,
das erste $b
wird als Zeichenkette linksbündig
in einem Feld der Länge 6 formatiert,
das zweite $b
wird als Zeichenkette zentriert
in einem Feld der Länge 6 formatiert,
schliesslich wird
das letzte $b
als Zeichenkette rechtsbündig
in einem Feld der Länge 6 formatiert,
format FILEHANDLE_TOP =
Definiert ein Format für den Kopf einer Ausgabeseite.
write FILEHANDLE;
Damit wird ein Datensatz entsprechend dem Format
mit den aktuellen Werten der Variablen geschreiben.
Perl Funktionen reichen von arithmetischen Funktionen und Funktionen für Zeichenketten bis zu Datenbank, Netzwerk und Interprozesskomunikations Funktionen.
Verwendung / Import von Modulen durch
use MODULE CONFIGLIST;
Module sind meist Objektorientiert implementiert
VAR = MODULE -> new();
VAR -> method(param);
CGI: Web Server Common Gateway Interface.
CPAN: Interface to Comprehensive Perl Archive Network.
Config: Interface zur Perl Konfiguration.
ExtUtils: Installation, Makefiles, C Programmierung.
File: Dateihandhabung
GetOpt: Auswerten von Kommandozeilen Parametern
IO: Ein-/Ausgabe auf Dateien und Sockets.
IPC: Inter Process Communication.
Math: Mathematische Funktionen.
Net: Netzwerk Hilfsmittel.
Term: Terminal IO.
Text: Textprocessing Hilfsmittel.
Time: Hilfsmittel für Zeitverwaltung.
User: Hilfsmittel für Benutzerverwaltung.
Perl Skript, das mit CGI zusammenarbeitet. Es dekodiert die von GCI empfangenen Variablen und Werte, generiert eine HTML Seite mit diesen Informationen und schickt sie an den Absender zurück.
#!/usr/bin/perl # test perl program to be used for parsing CGI methods # send anything to this script either via GET or POST methods &InsertHeader("CGI generated text"); &Parse; &InsertTrailer; # subrountines sub Parse { local(@pairs,$pair,$val,$pos, $i); if ($ENV{'REQUEST_METHOD'} eq "GET") { $in = $ENV{'QUERY_STRING'}; print "Submitted via GET<P>\n"; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $in, $ENV{'CONTENT_LENGTH'}+1); print "Submitted via POST<P>\n"; } $i = 0; @pairs = split(/&/, $in); foreach $pair (@pairs) { # do the special character conversion $pair =~ tr/+/ /; $pair =~ s/%(..)/pack("c",hex($1))/ge; $pos = index($pair,"="); $name = substr($pair,0,$pos); $val = substr($pair,$pos+1); $i++; $entry{$name} = $val; print "$i: entry\{\"$name\"\} = $entry{$name}<BR>\n"; } return 1; } sub InsertHeader { local ($htmltitle) = @_; print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD>\n<TITLE> " print "$htmltitle </TITLE>\n</HEAD>\n"; print "<BODY>\n"; return 1; } sub InsertTrailer { print "</BODY>\n</HTML>\n"; return 1; }
&InsertHeader;
bezeichnet eine Funktion, die
einen korrekten HTML Header erzeugt.
&InsertTrailer;
erzeugt den letzten Teil
der HTML Seite.
&Parse;
zerlegt die CGI-Parameter wie
im Abschnitt zu CGI besprochen.
Beispiele mit dem Script ex1.cgi
Zum Ausdrucken der Umgebungsvariablen klicken Sie hier.
Zum Ausdrucken der Umgebungsvariablen mit Querystring klicken Sie hier.
Das nächste Script benutzt ein Formular mit "Radio Buttons".
Ein neues Formular mit "Check Boxen", "PopUp Selektoren" und "Textbereichen".
Beispiele mit dem Script ex2.cgi
Dieses Script gibt alle "name-value" Paare der
QUERY_STRING
Variable aus (GET Methode).
Dieses Script gibt alle "name-value" Paare von
stdin
aus (POST Methode).
Beispiele mit dem Script ex3.cgi (mail)
Dieses Script schickt eine Email an den angegebenen Adressaten.
Beispiele mit dem Script ex4.cgi (logfile)
Dieses Script schreibt eine Nachricht in ein Log-File.
Stellt Hilfsmittel für den Einsatz als CGI Programm zur Verfügung.
Aufruf / Import mit
use CGI qw/:standard/
Erzeugen eines neuen CGI Objekts mit
$var = CGI -> new( param )
Abspeichern eines CGI Objekts in einer Datei
$var -> save( FILEHANDLE )
im Format
NAME1=VALUE1 NAME2=VALUE2 NAME3=VALUE3 =
Erzeugen eines neuen CGI Objekts aus einer Datei
$var = CGI -> new( FILEHANDLE )
Zugriff auf alle CGI Parameter mit
VAR -> param( PARAM )
Die Dekodierung der CGI Parameter erfolgt automatisch.
Für fast alle HTML Elemente gibt es eine Methode
header()
start_html()
end_html()
p(inhalt)
textarea(inhalt)
method({-ATTRIBUT => VALUE}, inhalt)
Diese Methoden können in beliebigen print-Statements verwendet werden.
In einer Datei werden die Bemerkungen der Gäste zusammen mit ihrem Namen und der Uhrzeit des Eintrags gespeichert.
$inhalt
$inhalt
Gästebuch in Aktion.
#!/usr/bin/perl use strict; use CGI qw/:standard *table/; use Fcntl qw/:flock/; sub fehler { my $err = "@_"; print "\n", h1("Unerwarteter Fehler"), "\n", p($err), "\n", end_html; } my( $GBuch, # Name der Gästebuch-Datei $MaxGB, # Maximale Anzahl von Einträgen in GB $GBTitel, # Titel des Gästebuchs $akt, # neuer Eintrag @inhalt, # Inhalt des Gästebuchs $eintrag # ein Eintrag im Gästebuch ); $GBTitel = "Gästebuch von Heinz Kredel"; $GBuch = "/tmp/gb-kredel "; $MaxGB = 10; print header; print start_html({-bgcolor=>'white'}, $GBTitel); print "\n", h1($GBTitel), "\n";
$akt = CGI->new(); if ($akt->param('eingabe')) { $akt->param("datum", scalar localtime); @inhalt = ($akt); } open(GBUCH,"+< $GBuch") || fehler("$GBuch kann nicht geöffnet werden."); flock(GBUCH, LOCK_EX) || fehler("$GBuch kann nicht exclusiv verwendet werden"); while (!eof(GBUCH) && @inhalt < $MaxGB) { $eintrag = CGI->new(\*GBUCH); push @inhalt, $eintrag; } seek(GBUCH, 0, 0 ) || fehler("$GBuch kann nicht zurückgesetzt werden."); foreach $eintrag (@inhalt) { $eintrag->save(\*GBUCH); } truncate(GBUCH, tell(GBUCH)); close(GBUCH);
print "\n", hr, "\n", start_form(); print start_table(); print "<tr><td valign='top'> <br>Nachricht: </td>\n<td valign='top'>", $akt->textarea(-NAME => "eingabe", -OVERRIDE => 1, -ROWS => "4", -COLS => "50", -VALUE => "" ), "</td></tr>\n"; print "<tr><td>Name: </td>\n<td>", $akt->textfield(-NAME => "name", -OVERRIDE => 1, -SIZE => "50", -VALUE => $akt->param('name')), "</td></tr>\n"; print "<tr><td>", $akt->reset("Löschen"), "</td>\n<td>", $akt->submit("Eintragen"),"</td></tr>\n"; print end_table(); print "\n", end_form(), "\n", hr, "\n"; print h2("Bisherige Einträge"), "\n"; foreach $eintrag (@inhalt) { print p($eintrag->param("eingabe")), "\n"; print p({-ALIGN => "right"}, $eintrag->param("name"), " @ ", $eintrag->param("datum"), ), "\n"; } print hr, "\n", end_html, "\n";
Perl ist nach wie vor eine wichtige Programmiersprache für CGI
viele Module und Hilfsprogramme für CGI verfügbar
Apache Modul perl_module
und fastcgi_module
erlauben hochperformante CGI Programme
mit Embedded Perl gibt es eine Konkurenz zu PHP
© Universität Mannheim, Rechenzentrum, 1998-2002.
Heinz Kredel Last modified: Fri Oct 24 17:27:32 CEST 2003