Je nach Request Method (GET/POST) werden die (z.B. Formular-)daten auf unterschiedliche Art übermittelt:
Das CGI- Programm verlangt je nachdem GET oder POST oder ist auf beides ausgelegt:
if($ENV{'REQUEST_METHOD'} eq 'GET') {
$buffer = $ENV{'QUERY_STRING'}
}
else {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
(siehe: auch Formulare definieren)
Dateien auf die Standardausgabe zu schreiben ist einfacher, dies erfolgt mit der Funktion print. Wichtig ist die erste Zeile- print "Content-type: text/html\n\n"; -, damit wird eine HTML- bzw. Text-Datei erstellt.
#! /usr/bin/perl print "Content-type: text/html\n\n"; print "<b>Hallo Kloake!</b>\n";
Mit dem bis jetzt erworbenen Wissen sind nun erste Beispielprogramme möglich:
#! /usr/bin/perl
#Eingabe auslesen
if($ENV{'REQUEST_METHOD'} eq 'GET') {
$Bildnr = $ENV{'QUERY_STRING'}
}
else {
read(STDIN, $Bildnr, $ENV{'CONTENT_LENGTH'});
}
#Ausgabe
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>Beyond Material - Minus 8 - image $Bildnr</title>\n";
print "<link rel=\"stylesheet\" type=\"text/css\" href=\"-8.css\">\n";
print "</head>\n";
print "<body>\n";
print ("<img src=\"../min8/i" ,$Bildnr, ".jpg\">");
print "</body>\n";
print "</html>\n";
Beim Übertragen von Formulardaten wird alles zusammengehängt, Leer- und Sonderzeichen werden ersetzt. Deshalb muss 'im Normalfall' die STDIN bzw. der Query String wieder gesplittet und decodiert werden, um damit arbeiten zu können:
#! /usr/bin/perl
#Eingabe auslesen (POST)
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
#String aufsplitten, Zeichen ersetzen, Liste erzeugen
@pairs = split(/&/, $buffer); # Name-Werte-Paare splitten
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
# Un-Webify plus signs and %-encoding
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s///g;
$value =~ s/<([^>]|\n)*>//g;
$FORM{$name} = $value;
}
Auf die einzelnen Felder kann nun mit $FORM('name_des_feldes_im_html_doku') zugegriffen werden. Angenommen: ein Form mit zwei Input-Feldern, eines mit name="name", das andere mit name="email". Variablen:
# Strings der Formularfelder in Variablen speichern
$name = "$FORM{'name'}";
$email = "$FORM{'email'}";