Embperl versteht zwei Katagorien von Befehlen. Die erste Kategorie sind
spezielle Embperl Befehle, die zweite besteht aus einer Reihe von
HTML Tags, die spezielle Funktionen anstoßen. Bevor Embperl Befehle bearbeitet (ebenso für Argumente von HTML Tags,
die von Embperl 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 <BR> 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. WICHTIGER HINWEIS: Wenn Sie einen Ascii Editor benutzen, um Ihre HTML Dokumente
zu schreiben, sollten Sie die Option optRawInput setzen. Dies verhindert das
Embperl den Quellentext in der oben beschriebenen Weise vorverarbeitet. Sollten Sie Probleme mit Ihrem Code haben, speziell mit HTML Tags oder
Dateihandles, versichern Sie sich, daß Sie die Ein- und Ausgabekodierung und
-dekodierung, die Embperl durchführt, verstanden haben. Weitere Hinweise finden sich
im Abschnitt L<"Inside Embperl"|"Inside Embperl - Wie der Embedded Perl Code intern ausgeführt wird"
und in den FAQs.> Alle Embperl 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. Embperl 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.
Ersetzt den Befehl durch das Resultat der Ausführung des Perl codes.
Perl Code 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 HINWEIS: Leerzeichen werden ignoriert. Die Ausgabe wird automatisch HTML kodiert
(z.B. wird '<' zu '<'). Die Ausgabekodierung kann mit der Variablen
$escmode gesteuert werden.
Führt den Perl Code 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<HINWEIS:> Perlbefehle, wie C<if>, C<while>, C<for>, etc., müssen innerhalb eines
I<Embperl> Blockes abgeschlossen werden. Es ist nicht möglich das C<if> 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. HINWEIS: Um Perlfunktionen zu definieren, benutzen Sie [! Perl Code !] (siehe unten)
da dies vermeidet, dass die Funktion bei jedem Aufruf neu übersetzt wird.
Wie [- 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.
(ab 1.2b2) hnlich wie C<[- Perl Code -]>. Der Hauptunterschied ist, daß [- Perl Code -] Blöcke immer
ihren eigenen Gültigkeitsbereich haben, während [* Perl Code *] Blöcke im selben
Gültigkeitsbereich ablaufen.
Dies ermöglicht lokale Variablen (mit local ) 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 Embperl Seite rekursiv mittes Execute
aufzurufen), ist es jedoch hilfreich. Ein zweiter Grund ist, die Möglichkeit Perlbefehle zu nutzen, die sich über
mehrere Blöcke hinziehen. Perls if , while , for , etc. können sich
nicht über mehrere C<[- Perl Code -]> Blöcke hinziehen, jedoch sehr wohl
über mehrere C<[* Perl Code *]> Blöcke. Beispiel: [* foreach $i (1..10) { *]
[- $a = $i + 5 -]
Schleifenzähler + 5 = [+ $a +] <br>
[* } *] Folgendes hingegen funktioniert nicht: [- foreach $i (1..10) { -]
irgendwelcher Text <br>
[- } -] Der selbe Effekt kann mit Embperl Meta Commands
erzielt werden (siehe unten) [$ foreach $i (1..10) $]
[- $a = $i + 5 -]
Schleifenzähler + 5 = [+ $a +] <br>
[$ endforeach $] HINWEIS 1: [* ... *] Blöcke müssen immer mit ;,{ oder } enden! HINWEIS 2: [* ... *] Blöcke können nicht innerhalb eines HTML Tags, welches
von Embperl interpretiert wird, verwendet werden.
(Außer die Bearbeitung des entsprechden Tags wurde ausgeschaltet) HINWEIS 3: Da die Ausführung von [- ... -] Blöcken durch Embperl gesteuert
wird, kann Embperl deutlich detailliertere debugging Ausgaben in der Logdatei
dafür erzeugen. Außerdem existieren für [- ... -] keinerlei Restriktionen, wo sie
genutzt werden können.
[# Text #] (Kommentar) | top |
(ab1.2b2) Dies ist ein Kommentarblock. Alles zwischen [# und #] wird aus dem HTML Dokument
entfernt, bevor es zum Browser gesandt wird. HINWEIS 1: [* ... *] Blöcke werden vor Kommentarblöcken ausgewertet, deshalb werden
sie auch innerhalb von Kommentarblöcken ausgeführt. HINWEIS 2: Alles innerhalb des Komentarblocks (außer [* ... *] ) wird aus dem Quellentext entfernt,
deshalb ist es möglich, Teile des Dokuments damit auszukommentieren.
[$ Cmd Arg $] (Meta-Commands) | top |
Ausführen eines Embperl Meta-Commands. Cmd kann einer der folgenden
Befehle sein:
(Arg variiert, je nach Befehl). | if, elsif, else, endif | | Alles nach dem if Meta-Command bis zum else,
elsif oder endif wird nur ausgegeben, wenn der Perlausdruck, welcher durch
Arg gegeben ist, wahr ist. else und elsif funktionieren entsprechend. Beispiel: [$ if $ENV{REQUEST_METHOD} eq 'GET' $]
Methode ist GET<BR>
[$ else $]
Andere Methode als GET wurde benutzt<BR>
[$ 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. | | | while, endwhile | | Führt eine Schleife aus, bis Arg des while Befehls falsch 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]} +]<BR>
[- $i++ -]
[$ endwhile $] Dies sendet alle Umgebungsvariablen zum Browser. HINWEIS: '<' wird zu '<' bevor es vom Perlinterpreter ausgeführt wird,
außer optRawInput ist gesetzt. | | | do, until | | Führt eine Schleife aus, bis Arg des until Befehls wahr ist. Beispiel: [- $i = 0 -]
[$ do $]
[+ $i++ +] <BR>
[$ until $i > 10 $] | | | foreach, endforeach | | Führt eine Schleife aus, für jedes Element des Array, welches als zweites
in Arg steht, wobei die Variable, die als erstes in Arg angegeben ist,
auf den entsprechenden Wert gesetzt wird. Beispiel: [- @arr = (1, 3, 5) -]
[$ foreach $v @arr $]
[+ $v +] <BR>
[$ endforeach $] | | | next | | 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) *] | | | last | | 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) *] | | | redo | | 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) *] | | | hidden | | Arg gibt keinen, einen oder zwei Hashs an (mit oder ohne
führendes '%' Zeichen) und ein optionales Array als dritten Parameter.
hidden erzeugt versteckte Eingabefelder für alle Werte, die im ersten Hash,
jedoch nicht im zweiten Hash, enthalten sind. Default ist
%fdat und %idat . Wenn der dritte Parameter angegeben ist, gibt er die
Reihenfolge der Felder an. Default ist @ffld .
Wenn Sie keine Parameter angeben, erzeugt Embperl für alle Werte, die
an dieses Dokument geschickt wurden (in %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) <FORM ACTION="inhalt.htm" METHOD="GET">
<INPUT TYPE="TEXT" NAME="field1">
[$ hidden $]
</FORM> Wenn Sie dieses Dokument mit
https://host/doc.htm?field1=A&field2=B&field3=C aufrufen, erzeugt Embperl folgende Ausgabe: <FORM ACTION="inhalt.htm" METHOD="GET">
<INPUT TYPE="TEXT" NAME="feld1" VALUE="A">
<INPUT TYPE="HIDDEN" NAME="field2" VALUE="B">
<INPUT TYPE="HIDDEN" NAME="field3" VALUE="C">
</FORM> | | | var | | Das var Meta-Command definert eine oder mehrere Variablen zur Benutzung
innerhalb dieser Embperlseite und setzt das
strict 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) ; HINWEIS: 'use strict' innerhalb eines Embperl Dokuments gilt nur innerhalb des Blockes,
in dem es erscheint. | | | sub | | (ab Embperl 1.2b5) Definiert eine Embperl-Funktion. Beispiel: [$ sub foo $]
<p> Hier steht was </p>
[$ endsub $] Diese Funktion kann entweder als normale Perlfunktion aufgerufen werden: [- foo -] oder mittels der Embperl::Execute Funktion. [- Execute ('#foo') # Kurzform -]
[- Execute ({ sub => 'foo'}) # Langform -] Der Unterschied ist, das Embperl nach dem Aufruf einer Embperl-Funktion
mittels Execute , die internen Zustände (Optionen, Debugflags etc.)
wieder auf die Werte vor dem Aufruf zurücksetzt. Außerdem ist es möglich
mittels Execute rekursive Funktionsaufrufe zu implementieren. Es ist ebenfalls möglich Parameter an eine Embperl-Funktion zu übergeben: [$ sub foo $]
[- $p = shift -]
<p> Hier zeigen wir den ersten Parameter [+ $p +]</p>
[$ endsub $]
[- foo ('value') -] Wenn Sie eine Reihe von oft benötigten Funktionen haben, können Sie sie in
einer Embperl Datei definieren und in Ihre Dokumente importieren: [- Execute ({ inputfile => 'mylib.htm', import => 1 }) -] Dies importiert alle Embperl-Funktionen, die in der Datei mylib.htm
definiert sind, in die aktuelle Seite, wo sie dann als normale Perlfunktionen
aufgerufen werden können. | |
Embperl behandelt die folgenden HTML Tags speziell. | TABLE, /TABLE, TR, /TR | | Embperl kann dynamische Tabellen erzeugen (ein- oder zweidimensional). Dazu
ist es lediglich nötig, eine Zeile oder Spalte anzugeben, Embperl expandiert
die Tabelle so weit wie nötig.
Dies geschieht durch die Benutzung der "magischen" Variablen $row , $col
oder $cnt . Solange Sie nicht eine der drei Variablen innerhalb einer Tabelle
benützen, läßt Embperl die Tabelle unverändert. Embperl überprüft ob $row , $col oder $cnt benutzt werden und wiederholt
allen Text zwischen <TABLE> und </TABLE>, solange der Block in dem
$row oder $cnt enthalten sind, ein Ergebnis ungleich undef zurück gibt.
Aller Text zwischen <TR> und </TR> wird wiederholt, wenn die Variable $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 $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 -]
<TABLE>
<TR>
<TD>[+ $i=$row +]</TD>
<TD>[+ $k[$row] +]</TD>
<TD>[+ $ENV{$k[$i]} +]</TD>
</TR>
</TABLE> Der obige Code zeigt alle Elemente des Array @k (das die Schlüssel von
%ENV enthält) an, so dass alle Umgebungsvariablen (wie im Beispiel
zu while) 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. | | | TH, /TH | | Das <TH> Tag wird als Tabellenüberschrift interpretiert. Wenn die ganze
Zeile aus <TH> und </TH>, statt aus <TD> und </TD> besteht, werden die
Zellen als Spaltenüberschriften interpretiert und nur einmal ausgegeben. | | | DIR, MENU, OL, UL, DL, SELECT, /DIR, /MENU,
/OL, /UL, /DL, /SELECT | | Listen, Menüs und Listboxen werden genau wie eindimensionale Tabellen
behandelt. Nur $row, $maxrow, $col, $maxcol und $tabmode
werden beachtet, $col und $maxcol werden ignoriert. Siehe auch
eg/x/lists.htm aus der Embperl Distribution für ein Beispiel. | | | OPTION | | Embperl prüft ob ein Wert für die entsprechende Option in den
Formulardaten (%fdat ) vorhanden ist. Wenn ja wird die
Option als ausgewählt angezeigt. Beispiel: <FORM METHOD="POST">
<P>Select Tag</P>
Wenn Sie dieses Dokument mit list.htm?SEL1=x aufrufen,
können Sie die Option bestimmen, die angewählt erscheint.
<P><SELECT NAME="SEL1">
<OPTION VALUE="[+ $v[$row] +]">
[+ $k[$row] +]
</OPTION>
</SELECT></P>
</FORM> | | | INPUT | | Das INPUT Tag arbeitet mit den Hashs %idat und %fdat zusammen.
Wenn das INPUT Tag kein VALUE Attribute hat, jedoch in %fdat ein
Element, das dem NAME Attribute entspricht, existiert, erzeugt Embperl
ein VALUE Attribute mit dem Wert aus %fdat .
Alle Werte der INPUT Tags werden in dem Hash %idat , mit dem Namen
des INPUT Tags als Schlüssel und ihrem Wert, gespeichert.
Für Radiobuttons und Checkboxen (TYPE=RADIO und TYPE=CHECKBOX ), wird
das CHECKED Attribute eingefügt, wenn der Wert des VALUE Attributes
mit dem Wert in %fdat übereinstimmt, andernfalls wird CHECKED
entfernt. Das bedeutet, wenn Sie die Formulardaten an das Dokument selbst schicken
(die URL des ACTION Attributes entspricht dem aktuellen Dokument
oder fehlt ganz), zeigen alle INPUT Tags automatisch die selben
Werte an, die der Benutzer vor dem Absenden eingegeben hat. | | | TEXTAREA, /TEXTAREA | | Das TEXTAREA Tag wird genau wie ein normales INPUT Tag behandelt (siehe oben) | | | META HTTP-EQUIV= ... | | META HTTP-EQUIV= ... überschreibt den entsprechenden HTTP Header. Dies
verhindert, das Netscape nachfragt, ob das Dokument neu geladen werden soll,
wenn der Content-Type zwischen META HTTP-EQUIV und HTTP Header unterschiedlich
ist.
Dies kann ebenfalls benutzt werden, um beliebige HTTP Header zu setzen.
Unter mod_perl können HTTP Header auch mit der Funktion header_out
gesetzt werden. Beispiel: <META HTTP-EQUIV="Language" CONTENT="DE"> Das entspricht der Apachefunktion: [- $req_rec -> header_out("Language" => "DE"); -] | | | A, EMBED, IMG, IFRAME, FRAME, LAYER | | Die Ausgaben von Perlblöcken innerhalb des HREF Attributes des A Tags und des
SRC Attributes der anderen Tags werden URL Kodiert, statt HTML Kodiert.
(siehe auch $escmode). Des weiteren expandiert Embperl Array- und Hashreferenzen
innerhalb solcher URLs zur URL Parametersyntax. Beispiel: [-
$A = {A => 1, B => 2} ; # Hashreference
@A = (X, 9, Y, 8, Z, 7)
-]
<A HREF="https://localhost/tests?[+ $A +]">
<A HREF="https://localhost/tests?[+ \@A +]"> wird von Embperl zu Folgendem expandiert: <A HREF="https://localhost/tests?A=1&B=2">
<A HREF="https://localhost/tests?X=9&Y=8&Z=7"> | |
|