Ausgaben
Das CGI
-Modul stellt einige Funktionen zur Ausgabe von HTTP-Headern und HTML-Code zur Verfügung. Diese
Funktionen wollen wir uns in diesem Thema etwas genauer anschauen.
Header
Mit der Funktion header()
einer CGI
-Instanz ist es möglich, einen HTTP-Header auszugeben. Der
Funktion kann eine Hash-Referenz übergeben werden. Als Namen für die Hash-Elemente stehen u. a. -status
,
-type
und -expires
zur Verfügung. Mit -status
kann die Statusmeldung gesetzt
werden, welche den Statuscode und den Statustext enthält. Die Statusmeldung befindet sich in der ersten Zeile in einem
HTTP-Antwort-Header. Die Standard-Statusmeldung ist 200 OK
, die nicht explizit gesetzt werden muss. Mit
-type
wird das HTTP-Headerfeld Content-Type
festgelegt. Dort wird der sogenannte MIME-Typ und
ggf. die Zeichenkodierung (engl. charset) festgelegt. Mittels -expires
kann der Ablaufzeitpunkt bzw.
die Gültigkeitsdauer des Dokuments festgelegt werden. Dies hat zur Folge, dass der Browser, wenn er das Dokument zum
ersten Mal anfragt, dieses für den angegebenen Zeitraum im Cache-Speicher ablegt. Wird das Dokument dann innerhalb dieses
Zeitraums erneut geladen, so wird dieses aus dem Cache geladen. Wird es hingegen nach dem Ablaufzeitraum aufgerufen, so wird
das Dokument erneut vom Server geholt. Als Wert für -expires
sind absolute Zeitangaben oder Zahlen in Kombination
mit Kürzeln (s
für Sekunde, m
für Minute, h
für Stunde, f
für Tage,
M
für Monate und y
für Jahr) möglich. Wird eine Zahl mit einem Kürzel verwendet, so muss der Zahl
noch ein Pluszeichen +
vorangestellt werden.
#!/usr/bin/perl -w use strict; use CGI; my $cgi = new CGI(); # Header-Ausgabe print $cgi->header({ -status => '200 OK', -expires => '+1h', -type => 'text/html; charset=UTF-8' }); # HTML-Ausgabe print <<END; <!Doctype html> <html> <head> <title>Ausgabe Header - Perl Code-Beispiel</title> <meta charset="utf-8" /> <meta name="robots" content="noindex,nofollow" /> <meta name="publisher" content="Homepage-Webhilfe" /> </head> <body> <p>Hier steht der Inhalt ...</p> </body> </html> END
HTML-Code
Bisher haben wir HTML-Code mittels print
-Befehlen ausgegeben. Doch im CGI
-Modul gibt es auch einige
Funktionen, die es ermöglichen, HTML-Code einfacher zu erzeugen. Das CGI
-Modul erzeugt standardmäßig einen
XHTML 1.0 Transitional konformen Code. Über Umwege können auch andere Dokumenttypen (z. B. HTML 4.01) gewählt werden. Das
Erzeugen von HTML5-Code ist jedoch nicht problemlos möglich, da HTML5 über keine DTD verfügt.
Als erstes wollen wir uns damit beschäftigen, die HTML-Grundstruktur sowie den Inhalt innerhalb des head
-Elements
zu erzeugen. Hierfür nutzen wir die Funktionen start_html()
und end_html()
. Der Funktion
start_html()
kann eine Hash-Referenz übergeben werden. Mittels -title
kann dort der Seitentitel
festgelegt werden. Die Elementnamen -style
und -script
erlauben das Einbinden von Stylesheet-
(link
-Element mit dem Wert stylesheet
im rel
-Attribut) und Skript-Dateien
(script
-Element). Über -encoding
kann die Zeichenkodierung festgelegt werden. Diese wird im
ausgegebenen HTML-Code in einem meta
-Element, welches lediglich bei älteren HTML-Versionen und XHTML verwendet
wird, angegeben. -lang
erlaubt das Festlegen der Sprache. Diese wird bei XHTML im html
-Element
über das Attribut lang
festgelegt. Weitere Meta-Angaben können mit -meta
spezifiziert werden.
Hier ein kurzer Beispielcode:
#!/usr/bin/perl -w use strict; use CGI; my $cgi = new CGI(); print $cgi->start_html({ -title => 'Meine Perl-Webseite', -encoding => 'UTF-8', -lang => 'de-DE', -meta => { 'publisher' => 'Max Mustermann' } }); print $cgi->end_html();
Der obige Code erzeugt folgenden HTML-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de-DE" xml:lang="de-DE"> <head> <title>Meine Perl-Webseite</title> <meta name="publisher" content="Max Mustermann" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> </body> </html>
Perl ist mit Hilfe des CGI
-Moduls in der Lage, so ziemlich jedes HTML-Element auszugeben. Dafür stehen die Funktionen
x()
, start_x()
und end_x()
zur Verfügung, wovon x
durch den HTML-Elementnamen
ersetzt wird (z. B. div()
, start_div()
und end_div()
). Den Funktionen x()
und start_x()
können eine Hash-Referenz übergeben werden. Der Funktion x()
kann des Weiteren noch der
Inahlt des Elements übergeben werden. Die Hash-Referenz wird dazu verwendet, die Attribute des Elements festzulegen. Dafür
wird als Elementname eines Hash-Eintrags der Name des Attributs mit einem vorangestellten Bindestrich -
notiert (z. B.
-style
für das style
-Attribut). Die Funktion x()
gibt das komplette Element (Start-Tag ggf.
mit Attributen, Inhalt und End-Tag) aus, wohingegen die Funktion start_x()
lediglich den Start-Tag (ggf. mit
Attributen) ausgibt. end_x()
gibt lediglich den End-Tag aus. Bei kleineren bzw. „einfacheren“ Ausgaben wird zumeist
die Funktion x()
verwendet. Die Funktionen start_x()
und end_x()
werden immer in
Kombination verwendet und dienen zur Ausgabe größerer und komplexerer Inhalte, da es hier möglich ist, zwischen den Funktionsaufrufen
anderen Perl-Code wie z. B. Verzweigungen oder Schleifen zu notieren. Mit Hilfe der Funktion comment()
ist es möglich,
einen HTML-Kommentar zu erzeugen. Als Parameter wird hier der Text für den Kommentar übergeben. Das folgende Beispiel zeigt die
Verwendung verschiedener Funktionen zur Ausgabe von HTML-Code mittels des CGI
-Moduls:
#!/usr/bin/perl -w use strict; use CGI; my $cgi = new CGI(); # Header-Ausgabe print $cgi->header({ -type => 'text/html; charset=UTF-8' }); # HTML-Ausgabe print $cgi->start_html({ -title => 'Ausgabe HTML-Code - Perl Code-Beispiel', -encoding => 'UTF-8', -lang => 'de-DE', -meta => { 'robots' => 'noindex,nofollow', 'publisher' => 'Homepage-Webhilfe' } }); print $cgi->comment('Ab hier kommt der Inhalt ...'); print $cgi->h1('Ausgabe HTML-Code'); print $cgi->img({ -style => 'float: left;', -src => '/Bilder/Logo/Logo.jpg', -width => 100, -height => 100, -alt => 'Homepage-Webhilfe Logo', -title => 'Homepage-Webhilfe' }); print $cgi->p({ -style => "width: 500px; text-align: justify;" }, '...'); print $cgi->br(); print $cgi->i('Copyright 2016 by '.$cgi->a({ -href => 'https://www.homepage-webhilfe.de', -target => '_blank' }, 'Homepage-Webhilfe') ); print $cgi->end_html();
Wichtig: Auf Grund von Überschneidungen mit dem Wortschatz von Perl müssen bei der Erzeugung der HTML-Elemente link
,
select
, sub
und tr
die Funktionsnamen mit einem Großbuchstaben geschrieben werden, also
z. B. Link()
an Stelle von link()
. Dies gilt auch für die Funktionen start_x()
und
end_x()
bei Verwendung einer der genannten Elemente.
Übrigens: Es ist natürlich auch möglich, Ausgaben mittels der Funktionen des CGI
-Moduls mit einfachen direkten
Ausgaben (wie im Einleitungsbeispiel) zu mischen.