| Inhalt |
|
Mit CGI-Scripts ist es möglich, interaktive Internetseiten zu erstellen.
Der Benutzer sieht ein Feld, in das er etwas eingibt und seine Daten absendet.
Das CGI-Programm reagiert dann darauf und schickt die entsprechenden Daten
wieder an den Benutzer zurück. Weiterhin ist es möglich, daß
Datenbanken abgefragt und entsprechend ausgeliefert werden.
Ein CGI-Script erwartet die Eingaben von der Standardeingabe des Systems
(bei UNIX STDIN); die Ausgaben erfolgen einfach auf die Standardausgabe
(bei UNIX STDOUT).
Bei Shellscripten sind Fehler schwerer zu finden, da das Script so lange
abgearbeitet wird, bis ein Fehler auftaucht.
Da Perlprogramme zuerst compiliert werden, erkennt man Fehler recht
schnell.
Um CGI-Scripts zu entwickeln, ist es sehr von Vorteil, wenn man LINUX
mit WWW-Server und X-Windows auf seinem Rechner installiert. Dann kann
man die Scripts in Ruhe testen. Es ist aber auch möglich, einen
WWW-Server (z.B. SAMBAR) auf einem WIN95-Rechner zu installieren. Die Perlprogramme
müssen dann meist nur ein wenig für UNIX angepasst werden.
Auf der CD können Sie die CGI-Scripts nicht testen. Falls Sie die Scripts testen möchten, wählen Sie die Seite: http://www.lehrer.uni-karlsruhe.de/~za186/RAI/cgiscripts.
Wie schickt der Browser die Daten zum Server ?
Bei einer URL der Form
Meist befindet sich auf einer Internetseite ein Eingabeformular. Jedes Feld eines solchen Formulars hat einen Namen (Feldvariablenname). Gibt der Benutzer etwas in das Feld ein, so schickt der Browser das Paar Feldvariable und Wert folgendermaßen an den Server:
Gibt es auf dem Formular mehrere Felder, so werden die einzelnen Paare Feldvariablenname=Wert vom Browser durch ein "&" getrennt. Hier ein Beispiel:
Leerzeichen werden vom Browser durch "+"-Zeichen übertragen. Umlaute
werden in Hexcodes kodiert. Daher muß bei jedem Wert eine entsprechende
Umwandlugsroutine die "+"-Zeichen wieder in Leerzeichen und die Hexcodes
wieder in Umlaute umwandeln.
1.) Shellscripts als CGI-Scripts
Shellscripts sind ausführbare Programm, die nur aus UNIX-Befehlen bestehen.
Beispiel 1: Das Programm zeigt nur den prinzipiellen Aufbau eines Shellscripts
#! /bin/sh # der Befehl "echo" schreibt einfach auf die Standardausgabe # ein " kann durch \042 ausgegeben werden # Bsp: echo "Dies ist ein \042Test\042" # es funktioniert aber: echo "<A HREF='datei.html'>zeigen</A>" # ------------------------------------------------------------ echo Content-type: text/html echo # dies leere Zeile muß bei HTML sein echo "<HTML><HEAD><TITLE>Beispiel 1</TITLE></HEAD>" echo "<BODY>" echo "<CENTER>" echo "<H2>Regionaler Arbeitskreis Internet RAI</H2>" echo "<B>Einführung in die Programmierung von CGI-Scripts</B>" echo "<CENTER>" echo "</BODY>" echo "</HTML>"Starten (nur online)
Beispiel 2: Das Programm erwartet vom Benutzer eine Eingabe. Diese wird mit einem Dankschön zurückgeschickt.
#! /bin/sh # in $QUERY_STRING steht die vom Browser übertragenene Datenzeile # (nur bei Methode GET) # --------------------------------------------------------------- echo Content-type: text/html echo echo "<HTML><HEAD><TITLE>Beispiel 2</TITLE></HEAD>" echo "<BODY>" echo "<CENTER>" echo "<H2>Regionaler Arbeitskreis Internet RAI</H2>" echo "<B>Einführung in die Programmierung von CGI-Scripts</B>" echo "</CENTER>" if [ $QUERY_STRING ] then echo "<P>" echo "Ihre Eingabe: " eval $QUERY_STRING # eingabe=wert wird evaluiert echo "<B>"$eingabe"</B>" # hier koennte auch $QUERY_STRING stehen echo "<P>" # dann wird aber 'eingabe=.....' ausgegeben echo "Vielen Dank für Ihre Eingabe !" echo "<HR>" echo "<A HREF='bsp2.cgi'>nochmals etwas eingeben ?</A>" else echo "<FORM METHOD='GET' action='bsp2.cgi'>" echo "<INPUT TYPE=TEXT NAME='eingabe'>" echo "<INPUT TYPE=SUBMIT VALUE=' abschicken '>" echo "</FORM>" fi echo "</BODY>" echo "</HTML>"Starten (nur online)
Beispiel 3: Der Benutzer tätigt eine Eingabe; die Eingabe gelangt in eine einfache Datenbankdatei.
#! /bin/sh # --------------------------------------------------------------- echo Content-type: text/html echo # ein Return ausgeben echo "<HTML><HEAD><TITLE>Beispiel 3</TITLE></HEAD>" echo "<BODY>" echo "<CENTER>" echo "<H2>Regionaler Arbeitskreis Internet RAI</H2>" echo "<B>Einführung in die Programmierung von CGI-Scripts</B>" echo "</CENTER>" if [ $QUERY_STRING ] then echo "<P>" echo "Ihre Eingabe: " eval $QUERY_STRING echo "<B>"$eingabe"</B>" # hier koennte auch $QUERY_STRING stehen echo "<P>" # dann wird aber 'eingabe=.....' in die Datei geschrieben echo "Die Daten befinden sich in bsp3.txt!" echo $eingabe >> bsp3.txt # Die Daten in die Datei hinzufuegen echo "<HR>" echo "<A HREF='bsp3.cgi'>nochmals etwas eingeben ?</A>" echo "<P>" echo "<A HREF='bsp3.txt'>zeige die Datei</A>" # mv bsp3.txt bsp4.txt, tr '+' ' ' < bsp4.txt > bsp3.txt, # um +-Zeichen in Spaces zu verandeln else # das Eingabeformular anzeigen echo "<FORM METHOD='GET' action='bsp3.cgi'>" echo "<INPUT TYPE=TEXT NAME='eingabe'>" echo "<INPUT TYPE=SUBMIT VALUE=' abschicken '>" echo "</FORM>" fi echo "</BODY>" echo "</HTML>"Starten (nur online)
Beispiel 4: Es existiert eine Adressedatenbank; der Benutzer gibt einen Namen ein, die Adresse wird vollständig ausgegeben.
#! /bin/sh # grep suchstring dateiname.txt # gibt alle Zeilen der Datei "dateiname.txt" aus, # in denen "suchstring" vorkommt # ------------------------------------------------------------ echo Content-type: text/html echo echo "<HTML><HEAD><TITLE>Beispiel 4</TITLE></HEAD>" echo "<BODY>" echo "<CENTER>" echo "<H2>Regionaler Arbeitskreis Internet RAI</H2>" echo "<B>Einführung in die Programmierung von CGI-Scripts</B>" echo "</CENTER>" if [ $QUERY_STRING ] then echo "<P>" echo "Ihre Eingabe: " eval $QUERY_STRING echo "<B>"$eingabe"</B>" # hier koennte auch $QUERY_STRING stehen echo "<P>" # dann wird aber 'eingabe=.....' ausgegeben echo "Gefundene Daten:<BR>" grep -i $eingabe Namensliste.sort # -i = ignoriere Gross/Kleinschreibung echo "<HR>" fi echo "<FORM METHOD='GET' action='bsp4.cgi'>" echo "<INPUT TYPE=TEXT NAME='eingabe'>" echo "<INPUT TYPE=SUBMIT VALUE=' abschicken '>" echo "</FORM>" echo "</BODY>" echo "</HTML>"starten (nur online)
#! /bin/sh
# awk ist ein Programm zur Manipulation von Textdateien
# zu awk und sed gib es komplette Buecher
# normalerweise trennt awk die Inhalte, die durch Leerzeichen getrennt sind
# mit dem Parameter -F: wird das Trennzeichen ":" verwendet
# die einzelnen Felder gelangen in $1, $2, $3 usw.
# tr ist ein Programm, das in einer Datei Zeichen durch andere Zeichen ersetzt
# ----------------------------------------------------------------------------
echo Content-type: text/html
echo
echo "<HTML><HEAD><TITLE>Beispiel 5</TITLE></HEAD>"
echo "<BODY>"
echo "<CENTER>"
echo "<H2>Regionaler Arbeitskreis Internet RAI</H2>"
echo "<B>Einführung in die Programmierung von CGI-Scripts</B>"
echo "</CENTER>"
if [ $QUERY_STRING ]
then
echo "<P>"
echo "Ihre Eingabe: "
eval $QUERY_STRING
echo "<B>"$eingabe"</B>" # hier koennte auch $QUERY_STRING stehen
echo "<P>" # dann wird aber 'eingabe=.....' ausgegeben
echo "Gefundene Daten:<BR>"
grep -i $eingabe Namensliste.sort >dummy1.txt
tr '~' ':' <dummy1.txt > dummy2.txt # nur bei Namensliste.sort
awk -F: '{print $1":"$5":"$6":"$7":"$8"<BR>" }' dummy2.txt # : als Trennzeichen
echo "<HR>"
fi
echo "<FORM METHOD='GET' action='bsp5.cgi'>"
echo "<INPUT TYPE=TEXT NAME='eingabe'>"
echo "<INPUT TYPE=SUBMIT VALUE=' abschicken '>"
echo "</FORM>"
echo "</BODY>"
echo "</HTML>"
starten
(nur online)
#! /bin/sh
# -------------------------------------------------------------
echo Content-type: text/html
echo
echo "<HTML><HEAD><TITLE>Beispiel 6</TITLE></HEAD>"
echo "<BODY>"
echo "<CENTER>"
echo "<H2>Regionaler Arbeitskreis Internet RAI</H2>"
echo "<B>Einführung in die Programmierung von CGI-Scripts</B>"
echo "</CENTER>"
if [ $QUERY_STRING ]
then
echo "<P>"
echo "Ihre Eingabe: "
eval $QUERY_STRING
echo "<B>"$eingabe"</B>" # hier koennte auch $QUERY_STRING stehen
echo "<P>" # dann wird aber 'eingabe=.....' ausgegeben
echo "Gefundene Daten:<BR>"
grep -i $eingabe Namensliste.sort >dummy1.txt
tr '~' ':' <dummy1.txt > dummy2.txt # nur bei Namensliste.sort
echo "<TABLE BORDER=1>"
# die nächste Zeile soll in einer Zeile stehen !
awk -F: '{print "<TR><TD>"$1"</TD><TD>"$5"</TD><TD>"$6"</TD>\
<TD>"$7"</TD><TD>"$8"</TD></TR>" }' dummy2.txt
echo "</TABLE>"
fi
echo "<FORM METHOD='GET' action='bsp6.cgi'>"
echo "<INPUT TYPE=TEXT NAME='eingabe'>"
echo "<INPUT TYPE=SUBMIT VALUE=' abschicken '>"
echo "</FORM>"
echo "</BODY>"
echo "</HTML>"
Starten
(nur online)
2.) Perlscripts als CGI-Scripts
Perl ist eine richtige und mächtige Programmiersprache,
die auf UNIX und LINUX-Maschinen läuft.
Mittlerweile gibt es auch Perl für DOS und Windows.
Wichtig:
#! /usr/bin/perl # Zahl als Zahl $zahl=1.3; $zahl2=5+$zahl; print "Ausgabe: $zahl2\n";Hier verhält sich $zahl als Zahl: Ausgabe: 6.3 |
#! /usr/bin/perl # Zahl als String $zahl=1.3; $einstring="Test" . $zahl; print "Ausgabe: $einstring\n";Hier verhält sich $zahl als String: Ausgabe: Test1.3 |
Beispiel 1: Das Programm zeigt nur den prinzipiellen Aufbau eines Perlprogramms
#! /usr/bin/perl # \n ist das Zeichen fuer zeilenvorschub # ---------- einfaches Beispiel --------------------- print "Content-Type: Text/html\n\n"; print "<HTML><HEAD><TITLE>Beispiel 1</TITLE></HEAD>\n"; print "<BODY>\n"; print "<CENTER>\n"; print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n"; print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n"; print "<CENTER>\n"; print "</BODY>\n"; print "</HTML>\n";starten (nur online)
Beispiel 2.) Das Programm erwartet vom Benutzer eine Eingabe. Diese wird mit einem Dankschön zurückgeschickt.
#! /usr/bin/perl
# Die Uebertragungsmethode GET kann-abhaengig vom Browser-nur eine
# beschraenkte Anzahl Zeichen senden. Die Methode POST ermoeglicht
# eine beliebige Anzahl von Zeichen
# Die hier gezeigte Eingaberoutine kann beide Methoden abfragen.
# ----------- mit Eingabemoeglichkeit ----------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 2 mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "</CENTER>\n";
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) {
print "<P>\n";
print "Ihre Eingabe: \n";
($var,$wert)=split(/=/,$eingabe); # trennt die Feldvariable vom Wert
$wert =~ tr/+/ /; # alle +-Zeichen in Space verwandeln
# Problem: Umlaute (siehe naechstes Bsp.)
print "<B>$wert</B>\n"; # automatische Variablenersetzung bei Perl
print "<P>";
print "Vielen Dank für Ihre Eingabe !\n";
print "<HR>\n";
print "<A HREF=\"bsp2p.cgi\">nochmals etwas eingeben ?</A>\n";
}
else {
print "<FORM METHOD=\"GET\" action=\"bsp2p.cgi\">\n";
print "<INPUT TYPE=TEXT NAME='eingabe'>\n";
print "<INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
}
print "</BODY>\n";
print "</HTML>\n";
starten
(nur online)
Beispiel 3.) Der Benutzer tätigt eine Eingabe; die Eingabe gelangt in eine einfache Datenbank.
#! /usr/bin/perl
# ----------- in eine Datei schreiben -------------------------
$dateiname="bsp3p.txt"; # Dateiname festlegen
# -------------------------------------------------------------
# =~s/../../ ist ein Substitutions-Operator (sehr maechtig !)
# fuer Dateien wird open(..) und close(..) verwendet.
# -------------------------------------------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 3 mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "</CENTER>\n";
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) {
print "<P>\n";
print "Ihre Eingabe: \n";
($var,$wert)=split(/=/,$eingabe); # aufsplitten in Variable und Wert
$wert =~ tr/+/ /; # alle +-Zeichen in Space verwandeln
$wert =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg; # Umlaute wandeln
print "<B>$wert</B>\n"; # automatische Variablenersetzung bei Perl
print "<P>";
print "Wurde in die Datei <B>$dateiname</B> geschrieben !\n";
open(FILEHANDLE,">>$dateiname");
print FILEHANDLE "$wert\n";
close(FILEHANDLE);
print "<HR>\n";
print "<A HREF=\"bsp3p.cgi\">nochmals etwas eingeben ?</A>\n";
print "<P><A HREF=$dateiname>Dateiinhalt zeigen</A>\n";
}
else {
print "<FORM METHOD=\"GET\" action=\"bsp3p.cgi\">\n";
print "<INPUT TYPE=TEXT NAME='eingabe'>\n";
print "<INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
}
print "</BODY>\n";
print "</HTML>\n";
starten
(nur online)
Beispiel 4.) Es existiert eine Adressedatenbank, Der Benutzer gibt einen Namen ein, die Adresse wird vollständig ausgegeben.
#! /usr/bin/perl
# ----------- eine Datei durchsuchen -------------------------
$dateiname="Namensliste.sort"; # Dateiname festlegen
# ------------------------------------------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 4a mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "</CENTER>\n";
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) {
print "<P>\n";
print "Ihre Eingabe: \n";
($var,$wert)=split(/=/,$eingabe); # aufsplitten in Variable und Wert
$wert =~ tr/+/ /; # alle +-Zeichen in Space verwandeln
$wert =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg; # Umlaute wandeln
print "<B>$wert</B>\n"; # automatische Variablenersetzung bei Perl
print "<P>";
print "Gefunden in: <B>$dateiname</B><BR>\n";
open(FILEHANDLE,$dateiname);
while (<FILEHANDLE>) { # Zeile fuer Zeile lesen --> $_
chop; # Zeile in $_, es geht auch chop($_);
if (index($_,$wert) > -1) { # Zeile gefunden ? (entspricht dem POS in Pascal)
print "$_<BR>\n"; # dann komplett ausgeben
}
}
close(FILEHANDLE);
}
print "<HR>\n";
print "<FORM METHOD=\"GET\" action=\"bsp4ap.cgi\">\n";
print "<INPUT TYPE=TEXT NAME='eingabe'>\n";
print "<INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
print "</BODY>\n";
print "</HTML>\n";
starten
(nur online)
#! /usr/bin/perl
# ----------- in eine Datei schreiben -------------------------
$dateiname="Namensliste.sort"; # Dateiname festlegen
# ------------------------------------------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 4b mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "</CENTER>\n";
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) {
print "<P>\n";
print "Ihre Eingabe: \n";
($var,$wert)=split(/=/,$eingabe); # aufsplitten in Variable und Wert
$wert =~ tr/+/ /; # alle +-Zeichen in Space verwandeln
$wert =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg; # Umlaute wandeln
print "<B>$wert</B>\n"; # automatische Variablenersetzung bei Perl
print "<P>";
print "Gefunden in: <B>$dateiname</B><BR>\n";
open(FILEHANDLE,$dateiname);
while (<FILEHANDLE>) {
chop; # Zeile in $_, es geht auch chop($_);
$_ =~ tr/~/:/;
if (index($_,$wert) > -1) { # Zeile gefunden ?
($n1,$n2,$n3,$n4,$n5,$n6,$n7,$n8)=split(/:/,$_); # die Zeile in Felder aufsplitten
print "$n1:$n5:$n6:$n7:$n8<BR>\n"; # dann ausgeben
}
}
close(FILEHANDLE);
}
print "<HR>\n";
print "<FORM METHOD=\"GET\" action=\"bsp4bp.cgi\">\n";
print "<INPUT TYPE=TEXT NAME='eingabe'>\n";
print "<INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
print "</BODY>\n";
print "</HTML>\n";
starten
(nur online)
print "<TABLE BORDER=3>\n";
open(FILEHANDLE,$dateiname);
while (<FILEHANDLE>) {
chop; # Zeile in $_, es geht auch chop($_);
$_ =~ tr/~/:/;
if (index($_,$wert) > -1) { # Zeile gefunden ?
($n1,$n2,$n3,$n4,$n5,$n6,$n7,$n8)=split(/:/,$_); # dann ausgeben
print "<TR><TD>$n1</TD><TD>$n5</TD><TD>$n6</TD><TD>$n7</TD><TD>$n8</TD></TR>\n";
} } close(FILEHANDLE); print "</TABLE>\n";starten (nur online)
Beispiel 5.) Ein Benutzer schreibt einen kleinen Text. Dieser Text wird als Email abgeschickt.
#! /usr/bin/perl
# ----------- in eine Datei schreiben ------------------------------
$myemailadress="za186\@localhost"; # Emailadresse festlegen
# hier muessen Sie natuerlich
# Ihre eigene Emailadresse
# angeben
# ------------------------------------------------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 5 mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "</CENTER>\n";
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) { # ist ueberhaupt etwas vorhanden ?
# Zerlegen des Datenstroms
($par1,$par2,$par3)=split(/&/,$eingabe); # aufsplitten der einzelnen Eingaben
($var,$mailtext)=split(/=/,$par1); # aufsplitten der Variablen und Werte
($var,$yourname)=split(/=/,$par2);
($var,$youremail)=split(/=/,$par3);
# Leerzeichen und Umlaute umwandeln
$mailtext =~ tr/+/ /; $mailtext =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
$yourname =~ tr/+/ /; $yourname =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
$youremail =~ tr/+/ /; $youremail =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
# und erstmal auf den Bildschirm bringen
print "<P>\n";
print "Ihre Eingabe:<BR>$mailtext\n";
print "<BR>von $yourname\n";
print "<BR>wurde als Email an <B>$myemailadress</B> abgeschickt.\n";
print "<HR>\n";
print "<A HREF=\"bsp5p.cgi\">nochmals eine Mail schicken ?</A>\n";
# jetzt als Email abschicken
open(MAIL,"|mail $myemailadress");
print MAIL "$mailtext\n";
print MAIL "von $yourname\n";
print MAIL "Reply to: $youremail\n";
close(MAIL);
}
else { # Ausgabe des Formulars zum Eingeben der Daten
print "Bitte schreiben Sie mir eine Email:<P>\n";
print "<FORM METHOD=\"GET\" action=\"bsp5p.cgi\">\n";
print "Ihr Text:<BR>\n";
print "<TEXTAREA NAME=\"Kommentar\" ROWS=5 COLS=60></TEXTAREA>\n";
print "<BR>Ihr Name:<BR>\n";
print "<INPUT TYPE=TEXT NAME=\"Name\">\n";
print "<BR>Ihre Emaladresse:<BR>\n";
print "<INPUT TYPE=TEXT NAME=\"Email\">\n";
print "<BR>\n";
print "<INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
}
print "</BODY>\n";
print "</HTML>\n";
starten
(nur online)
Beispiel 6.) Ein etwas aufwendigeres
Perlprogramm.
Der Benutzer gibt Namen, Wohnort und Familienstand an. Die Daten werden
in einer Datei gespeichert und ausgegeben.
Eignet sich auch für ein kleines Gästebuch)
#! /usr/bin/perl
# ----------- einfache Datenbank -----------------------------
$dateiname="bsp6p.txt"; # Dateiname festlegen
# ------------------------------------------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 6 mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "</CENTER>\n";
# lies die Eingaben des Anwenders
# -------------------------------
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) { # falls ueberhaupt etwas eingegeben wurde (hier immer der Fall)
# Zerlegen des Datenstroms
($par1,$par2,$par3,$par4)=split(/&/,$eingabe); # aufsplitten der einzelnen Eingaben
($var,$zuname)=split(/=/,$par1); # aufsplitten der Variablen und Werte
($var,$vorname)=split(/=/,$par2);
($var,$wohnort)=split(/=/,$par3);
($var,$famstand)=split(/=/,$par4);
# Leerzeichen und Umlaute umwandeln
$zuname =~ tr/+/ /; $zuname =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
$vorname =~ tr/+/ /; $vorname =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
$wohnort =~ tr/+/ /; $wohnort =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
$famstand =~ tr/+/ /; $famstand =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
# und in Datei speichern
open(FILEHANDLE,">>$dateiname");
print FILEHANDLE "$zuname:$vorname:$wohnort:$famstand\n";
close(FILEHANDLE);
}
# Ausgabe des Formulars zum Eingeben der Daten
# --------------------------------------------
print "<HR>\n";
print "Bitte geben Sie Ihre Daten ein:<P>\n";
print "<FORM METHOD=\"GET\" action=\"bsp6p.cgi\">\n";
print "<BR>Ihr Zuname:<INPUT TYPE=TEXT NAME=\"zuname\">\n";
print "<BR>Ihr Name:<INPUT TYPE=TEXT NAME=\"vorname\">\n";
print "<BR>Ihr Wohnort:<INPUT TYPE=TEXT NAME=\"wohnort\">\n";
print "<BR>Familienstand:<SELECT NAME=\"famstand\">\n";
print "<OPTION>ledig\n";
print "<OPTION SELECTED>verheiratet\n";
print "<OPTION>verwittwet\n";
print "<OPTION>geschieden\n";
print "</SELECT>\n";
print "<BR><INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
# Einlesen der bisher gespeicherten Daten
# ---------------------------------------
open(FILEHANDLE,$dateiname);
while(<FILEHANDLE>) {
chop; # Returns am Ende der Zeile $_ entfernen
push(@daten,$_); # in ein Array @daten hinzufuegen
}
close(FILEHANDLE);
# Sortierte Ausgabe auf den Bildschirm
# ------------------------------------
print "<HR>\n";
print "<B>Diese Daten sind gespeichert:</B><BR>\n";
@datensortiert=sort @daten;
foreach $zeile (@datensortiert) { print "$zeile<BR>\n"; }
# Ende der HTML-Seite
print "</BODY>\n";
print "</HTML>\n";
starten
(nur online)
Beispiel 7.) Auswertung von Radiobuttons und Checkboxes.
#! /usr/bin/perl
# ----- Auswertung von Radiobuttons und Checkboxes -----------
# ------------------------------------------------------------
print "Content-Type: Text/html\n\n";
print "<HTML><HEAD><TITLE>Beispiel 7 mit Perl</TITLE></HEAD>\n";
print "<BODY>\n";
print "<CENTER>\n";
print "<H2>Regionaler Arbeitskreis Internet RAI</H2>\n";
print "<B>Einführung in die Programmierung von CGI-Scripts</B>\n";
print "<BR>Auswerung von Radiobuttons und Checkboxes";
print "</CENTER>\n";
# lies die Eingaben des Anwenders
# -------------------------------
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) { $eingabe=$ENV{"QUERY_STRING"}; }
else { read(STDIN, $eingabe, $ENV{"CONTENT_LENGTH"}); }
if ($eingabe) { # falls ueberhaupt etwas eingegeben wurde (hier immer der Fall)
# Zerlegen des Datenstroms
($par1,$par2,$par3)=split(/&/,$eingabe); # aufsplitten der einzelnen Feldpaare
($var,$name)=split(/=/,$par1); # aufsplitten der Variablen und Werte
($var,$famstand)=split(/=/,$par2);
($var,$inf)=split(/=/,$par3);
# Leerzeichen und Umlaute umwandeln
$name =~ tr/+/ /; $name =~ s/%([0-9A-F]{2})/pack(C,hex($1))/ieg;
# auf dem Bildschirm ausgeben
print "Ihre Angaben:<BR>\n";
print "<BR>Name: $name\n";7
print "<BR>Familienstand: $famstand\n";
print "<BR>Informationsmaterial: $inf\n";
}
# Ausgabe des Formulars zum Eingeben der Daten
# --------------------------------------------
print "<HR>\n";
print "Bitte geben Sie Ihre Daten ein:<P>\n";
print "<FORM METHOD=\"POST\" action=\"bsp7p.cgi\">\n";
print "<BR>Ihr Name:<INPUT TYPE=TEXT NAME=\"name\">\n";
print "<BR>Familienstand:\n";
print "<INPUT TYPE=\"RADIO\" NAME=\"Famstand\" VALUE=\"ledig\" CHECKED>ledig\n";
print "<INPUT TYPE=\"RADIO\" NAME=\"Famstand\" VALUE=\"verheiratet\">verheiratet\n";
print "<INPUT TYPE=\"RADIO\" NAME=\"Famstand\" VALUE=\"verwittwet\">verwittwet\n";
print "<INPUT TYPE=\"RADIO\" NAME=\"Famstand\" VALUE=\"geschieden\">geschieden\n";
print"<BR><INPUT TYPE=\"CHECKBOX\" NAME=\"Inf\" VALUE=\"JA\"> Informationsmaterial zuschicken ?\n";
print "<BR><INPUT TYPE=SUBMIT VALUE=\" abschicken \">\n";
print "</FORM>\n";
# Ende der HTML-Seite
print "</BODY>\n"; print "</HTML>\n";
starten
(nur online)
In Perl ist es möglich, UNIX-Befehle aufzurufen.
Zum Beispiel kann ein solcher Aufruf folgendermaßen lauten:
#! /usr/bin/perl
# wandelt HTML-Text in normalen Text um; alle TAGS werden entfernt
# --------------------------------------------------------------------
print "Bitte die umzuwandelnde Datei: ";
$dateiname=<STDIN>; # erwartet eine Eingabe des Benutzers
chop($dateiname); # das Return am Ende entfernen
$neudateiname=$dateiname . ".txt"; # Dateiname der umgewandelten Datei
open(ALTDATEI, $dateiname);
open(NEUDATEI, ">$neudateiname");
while (<ALTDATEI>) { # alle Zeilen lesen, gelangen nach $_
chop; # Returns am Ende der Zeile entfernen
$_ =~ s/<.*?>//g; # alle Tags löschen
print NEUDATEI "$_\n"; # in die neue Datei schreiben
}
close(NEUDATEI);
close(ALTDATEI);
print "Ihr Text befindet sich in $neudateiname\n";
Weitere Informationen über die Programmierung in Perl(mit
ausführlicher Referenz)
finden Sie unter der Seite: http://www.lehrer.uni-karlsruhe.de/~za186/perl/perl01.htm
oder auf der RAI_CD unter einfuehrungen/perl/perl01.htm.
Weitere Informationen zu UNIX/LINUX
finden Sie unter: http://www.lehrer.uni-karlsruhe.de/~za186/Unix/unix.htm
oder auf der RAI_CD unter einfuehrungen/unix/unix.htm.
Eine Installationsanleitung zu LINUX von Andrea Neumann finden Sie auf der RAI_CD unter Linux/Installation/index.htm oder im Internet unter: http://www.lehrer.uni-karlsruhe.de/~za1641.
Weiteres zu CGI findet man unter der UNIX-Tools-Seite ueber CgiWRAP: