=pod =head1 NAME Embperl - Erstellen dynamischer Websites mit Perl =head1 SYNOPSIS =head1 DESCRIPTION Embperl ist ein System zum Erstellen dynamischer Websites mit Perl. Für den Anfänger ist es ein einfacher Weg um dynamische Seiten durch Einbetten von Perlcode in HTML zu erstellen. Es stellt verschiedenste Features für das Webumfeld zur Verfügung, wei z.B. dynamischen Tabellen, Formularfeldverarbeitung, HTML/URL-Kodierung, Session Handling, Caching und mehr. Wenn die Anforderungen steigen ermöglicht es die Website objektorientiert, aus kleinen wiederverwendbaren Komponenten, aufzubauen. Wenn Sie Code und Layout nicht mixen wollen, unterstützt Sie Embperl, indem es erlaubt beides in verschiedene Objekte zu trennen (um z.B. MVC Applikationen zu bauen). Selbstverständlich kann Embperl nicht nur HTML verarbeiten, sondern ist in der Lage Komponenten in verschiedenen Quellenformaten (z.B. HTML, WML, XML, POD, ...) zu bearbeiten und diese, soweit nötig, in andere Ausgabeformate (z.B. via XSLT) zu transformieren. Dies wird dadurch erreicht, das die Ausgabeerzeugung in kleine Schritte zerlegt wird, wovon jeder von einem austauschbaren Provider bearbeitet wird. Für fortgeschrittenen Anwender bietet Embperl weitere Möglichkeiten, wie das Erstellen von eigenen Grammatiken (z.b. Tag-Bibiliotheken) oder das schreiben von benutzerspezifischen Providern. =head1 Syntax Embperl versteht zwei Katagorien von Befehlen. Die erste Kategorie sind spezielle I Befehle, die zweite besteht aus einer Reihe von HTML Tags, die spezielle Funktionen anstoßen. Bevor I Befehle bearbeitet (ebenso für Argumente von HTML Tags, die von I bearbeitet werden), werden alle HTML Tags, die sich innerhalb des Perlcodes befinden, entfernt und HTML kodierte Zeichen werden in ihre Ascii Äquvivalente umgewandelt, so daß sie der Perlinterpreter versteht. Dies ist nötig, um HTML Seiten, die von (WYSIWYG) HTML-Editoren erzeugt werden, zu verarbeiten. (z.B. um ein
innerhalb des Perlcodes zu entfernen, welches der HTML Editor in den Perlcode eingefügt hat, an einer Stelle, wo lediglich ein Zeilenumbruch sein sollte.) Um dieses zu unterbinden, können HTML Tags und HTML kodierten Zeichen (beides nur innerhalb des Perlcodes) ein Backslash ('\') vorangestellt werden. B Wenn Sie einen Ascii Editor benutzen, um Ihre HTML Dokumente zu schreiben, sollten Sie die Option L setzen. Dies verhindert das I den Quellentext in der oben beschriebenen Weise vorverarbeitet. B und in den FAQs.> Alle I Befehle fangen mit einer eckigen Klammer ('[') an und Enden mit der geschlossenen eckigen Klammer (']'). Um eine normale '[' im HTML Text zu erhalten, ist es nötig '[[' zu schreiben. I benutzt keine HTML Kommentare (z.B. ) oder andere spezielle HTML Tags, da es mit manchen HTML Editoren nicht, oder nur sehr umständlich, möglich ist, diese zu erzeugen. Da '[' von den HTML Editoren als normaler Text interpretiert wird, sollte es damit keinerlei Probleme geben, es vereinfacht in den meisten Fällen das schreiben der Dokumente erheblich. =head2 [+ Perl Code +] Ersetzt den Befehl durch das Resultat der Ausführung des Perl codes. C kann dabei beliebiger Perl code sein. Beispiel: [+ $a +] Ersetzt [+ $a +] mit dem Inhalt der Variablen $a. [+ $a+1 +] Beliebige Ausdrücke können benutzt werden. [+ $x[$i] +] Auch Arrays, Hashs oder komplexere Ausdrücke sind kein Problem B Leerzeichen werden ignoriert. Die Ausgabe wird automatisch HTML kodiert (z.B. wird '<' zu '<'). Die Ausgabekodierung kann mit der Variablen L<$escmode> gesteuert werden. =head2 [- Perl Code -] Führt den C aus. In der Ausgabe wird dieser Befehl jedoch vollständig entfernt. Beispiel: [- $a=1 -] Setzt die Variable $a auf 1. [- use SomeModule -] Andere Perlmodule können genutzt werden. [- $i=0; while ($i<5) {$i++} -] Auch komplexer Code kann verwendet werden. B Perlbefehle, wie C, C, C, etc., müssen innerhalb eines I Blockes abgeschlossen werden. Es ist nicht möglich das C in einem Block zu schreiben und die abschließenden Klammer ('}') in einem anderen Block. Dies ist nur mit L<[* Perl Code *]> Blöcken möglich. B Um Perlfunktionen zu definieren, benutzen Sie L<"[! Perl Code !]"> (siehe unten) da dies vermeidet, dass die Funktion bei jedem Aufruf neu übersetzt wird. =head2 [! Perl Code !] Wie L<[- Perl Code -]> wird aber nur beim ersten Aufruf des Dokuments ausgeführt. Dies kann genutzt werden, um Perlfunktionen zu definieren oder einmalige Initialisierungen auszuführen. =head2 [* Perl Code *] (ab 1.2b2) Ähnlich wie L>. Der Hauptunterschied ist, daß C<[- Perl Code -]> Blöcke immer ihren eigenen Gültigkeitsbereich haben, während C<[* Perl Code *]> Blöcke im selben Gültigkeitsbereich ablaufen. Dies ermöglicht lokale Variablen (mit C) mit einem Gültigkeitsbereich, der die ganze Seite umfasst, zu definieren. Normalerweise ist es nicht nötig lokale Variablen zu definieren, da Embperl jedem Dokument einen eigenen Namensraum zuordnet und die globalen Variablen nach jedem Request wieder aufgeräumt werden. In speziellen Fällen (z.B. um eine I Seite rekursiv mittes L aufzurufen), ist es jedoch hilfreich. Ein zweiter Grund ist, die Möglichkeit Perlbefehle zu nutzen, die sich über mehrere Blöcke hinziehen. Perls C, C, C, etc. können sich nicht über mehrere L> Blöcke hinziehen, jedoch sehr wohl über mehrere L> Blöcke. Beispiel: [* foreach $i (1..10) { *] [- $a = $i + 5 -] Schleifenzähler + 5 = [+ $a +]
[* } *] Folgendes hingegen funktioniert B: [- foreach $i (1..10) { -] irgendwelcher Text
[- } -] Der selbe Effekt kann mit I L erzielt werden (siehe unten) [$ foreach $i (1..10) $] [- $a = $i + 5 -] Schleifenzähler + 5 = [+ $a +]
[$ endforeach $] B C<[* ... *]> Blöcke B immer mit B<;>,B<{> oder B<}> enden! B C<[* ... *]> Blöcke können nicht innerhalb eines HTML Tags, welches von I interpretiert wird, verwendet werden. (Außer die Bearbeitung des entsprechden Tags wurde ausgeschaltet) B Da die Ausführung von C<[- ... -]> Blöcken durch I gesteuert wird, kann I deutlich detailliertere debugging Ausgaben in der Logdatei dafür erzeugen. Außerdem existieren für C<[- ... -]> keinerlei Restriktionen, wo sie genutzt werden können. =head2 [# Text #] (Kommentar) (ab1.2b2) Dies ist ein Kommentarblock. Alles zwischen C<[#> und C<#]> wird aus dem HTML Dokument entfernt, bevor es zum Browser gesandt wird. B C<[* ... *]> Blöcke werden vor Kommentarblöcken ausgewertet, deshalb werden sie auch innerhalb von Kommentarblöcken ausgeführt. B Alles innerhalb des Komentarblocks (außer C<[* ... *]>) wird aus dem Quellentext entfernt, deshalb ist es möglich, Teile des Dokuments damit auszukommentieren. =head2 [$ Cmd Arg $] (Meta-Commands) Ausführen eines I Meta-Commands. B kann einer der folgenden Befehle sein: (B variiert, je nach Befehl). =over 4 =item B, B, B, B Alles nach dem B Meta-Command bis zum B, B oder B wird nur ausgegeben, wenn der Perlausdruck, welcher durch B gegeben ist, I ist. B und B funktionieren entsprechend. Beispiel: [$ if $ENV{REQUEST_METHOD} eq 'GET' $] Methode ist GET
[$ else $] Andere Methode als GET wurde benutzt
[$ endif $] Dieses Beispiel sendet einen der zwei Sätze zum Browser, in Abhänigkeit davon, ob die GET-Methode benutzt wurde, um dieses Dokument abzurufen. =item B, B Führt eine Schleife aus, bis B des B Befehls I ist. Beispiel: (siehe auch eg/x/loop.htm aus der Embperl Distribution) [- $i = 0; @k = keys %ENV -] [$ while ($i < $#k) $] [+ $k[$i] +] = [+ $ENV{$k[$i]} +]
[- $i++ -] [$ endwhile $] Dies sendet alle Umgebungsvariablen zum Browser. B: '<' wird zu '<' bevor es vom Perlinterpreter ausgeführt wird, außer L ist gesetzt. =item B, B Führt eine Schleife aus, bis B des B Befehls I ist. Beispiel: [- $i = 0 -] [$ do $] [+ $i++ +]
[$ until $i > 10 $] =item B, B Führt eine Schleife aus, für jedes Element des Array, welches als zweites in B steht, wobei die Variable, die als erstes in B angegeben ist, auf den entsprechenden Wert gesetzt wird. Beispiel: [- @arr = (1, 3, 5) -] [$ foreach $v @arr $] [+ $v +]
[$ endforeach $] =item B Hat die selbe Funktion wie das Perl next statement. Es kann auch folgende Syntax benutzt werden, wodurch eine zusätzliche Bedingung (oder anderer Perlcode) eingefügt werden kann: [* next if ($foo) *] =item B Hat die selbe Funktion wie das Perl last Statement. Es kann auch folgende Syntax benutzt werden, wodurch eine zusätzliche Bedingung (oder anderer Perlcode) eingefügt werden kann: [* last if ($foo) *] =item B Hat die selbe Funktion wie das Perl redo statement. Es kann auch folgende Syntax benutzt werden, wodurch eine zusätzliche Bedingung (oder anderer Perlcode) eingefügt werden kann: [* redo if ($foo) *] =item B B gibt keinen, einen oder zwei Hashs an (mit oder ohne führendes '%' Zeichen) und ein optionales Array als dritten Parameter. C erzeugt versteckte Eingabefelder für alle Werte, die im ersten Hash, jedoch nicht im zweiten Hash, enthalten sind. Default ist C<%fdat> und C<%idat>. Wenn der dritte Parameter angegeben ist, gibt er die Reihenfolge der Felder an. Default ist C<@ffld>. Wenn Sie keine Parameter angeben, erzeugt I für alle Werte, die an dieses Dokument geschickt wurden (in C<%fdat> stehen), verstecke Eingabefelder, soweit dafür nicht schon andere Eingabefelder existieren. Dies ist nützlich, um Werte zwischen mehreren Formularen zu transportieren. Beispiel: (siehe auch eg/x/input.htm aus der Embperl Distribution)
[$ hidden $]
Wenn Sie dieses Dokument mit https://host/doc.htm?field1=A&field2=B&field3=C aufrufen, erzeugt I folgende Ausgabe:
=item B Das C Meta-Command definert eine oder mehrere Variablen zur Benutzung innerhalb dieser Embperlseite und setzt das B Pragma. Die Variablennamen müssen durch Leerzeichen getrennt werden. Beispiel: [$var $a %b @c $] Dies entspricht dem folgendem Perl code: use strict ; use vars qw($a %b @c) ; B: 'use strict' innerhalb eines I Dokuments gilt nur innerhalb des Blockes, in dem es erscheint. =item B (ab Embperl 1.2b5) Definiert eine Embperl-Funktion. Beispiel: [$ sub foo $]

Hier steht was

[$ endsub $] Diese Funktion kann entweder als normale Perlfunktion aufgerufen werden: [- foo -] oder mittels der L Funktion. [- Execute ('#foo') # Kurzform -] [- Execute ({ sub => 'foo'}) # Langform -] Der Unterschied ist, das I nach dem Aufruf einer Embperl-Funktion mittels C, die internen Zustände (Optionen, Debugflags etc.) wieder auf die Werte vor dem Aufruf zurücksetzt. Außerdem ist es möglich mittels C rekursive Funktionsaufrufe zu implementieren. Es ist ebenfalls möglich Parameter an eine Embperl-Funktion zu übergeben: [$ sub foo $] [- $p = shift -]

Hier zeigen wir den ersten Parameter [+ $p +]

[$ endsub $] [- foo ('value') -] Wenn Sie eine Reihe von oft benötigten Funktionen haben, können Sie sie in einer I Datei definieren und in Ihre Dokumente importieren: [- Execute ({ inputfile => 'mylib.htm', import => 1 }) -] Dies importiert alle Embperl-Funktionen, die in der Datei F definiert sind, in die aktuelle Seite, wo sie dann als normale Perlfunktionen aufgerufen werden können. =back =head2 HTML Tags I behandelt die folgenden HTML Tags speziell. =over 4 =item B, B
, B, B I kann dynamische Tabellen erzeugen (ein- oder zweidimensional). Dazu ist es lediglich nötig, eine Zeile oder Spalte anzugeben, I expandiert die Tabelle so weit wie nötig. Dies geschieht durch die Benutzung der "magischen" Variablen C<$row>, C<$col> oder C<$cnt>. Solange Sie nicht eine der drei Variablen innerhalb einer Tabelle benützen, läßt I die Tabelle unverändert. I überprüft ob C<$row>, C<$col> oder C<$cnt> benutzt werden und wiederholt allen Text zwischen und
, solange der Block in dem C<$row> oder C<$cnt> enthalten sind, ein Ergebnis ungleich I zurück gibt. Aller Text zwischen und wird wiederholt, wenn die Variable C<$col> benutzt wird und der Block, indem sie vorkommt, einen definierten Rückgabewert hat. Rückgabewert ist dabei immer das Ergebnis des letzten Ausdrucks innerhalb des Blocks. Mittels L<$tabmode> (siehe unten) kann das Tabellenendekriterium variiert werden. Beispiel: (siehe eg/x/table.htm in der Embperl Distribution für weitere Beispiele) [- @k = keys %ENV -]
[+ $i=$row +] [+ $k[$row] +] [+ $ENV{$k[$i]} +]
Der obige Code zeigt alle Elemente des Array C<@k> (das die Schlüssel von C<%ENV> enthält) an, so dass alle Umgebungsvariablen (wie im Beispiel zu I) angezeigt werden. Dabei enthält die erste Spalte den Index (ab Null zählend), die zweite Spalte den Variablennamen und die dritte Spalte den Wert der Umgebungsvariablen. =item B, B Das Tag wird als Tabellenüberschrift interpretiert. Wenn die ganze Zeile aus und , statt aus und besteht, werden die Zellen als Spaltenüberschriften interpretiert und nur einmal ausgegeben. =item B, B, B
    , B
      , B
      , B Listen, Menüs und Listboxen werden genau wie eindimensionale Tabellen behandelt. Nur L<"$row">, L<"$maxrow">, L<"$col">, L<"$maxcol"> und L<"$tabmode"> werden beachtet, L<$col> und L<$maxcol> werden ignoriert. Siehe auch F aus der I Distribution für ein Beispiel. =item B