Embperl - building dynamic websites with Perl


Syntax
[ << Prev: DESCRIPTION ] [ Content ] [ Next: Gültigkeitsbereiche von Variablen und Cleanup >> ]

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.



[+ Perl Code +]top

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 '&lt;'). Die Ausgabekodierung kann mit der Variablen $escmode gesteuert werden.



[- Perl Code -]top

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.



[! Perl Code !]top

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.



[* Perl Code *]top

(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 &lt; $#k) $]
 [+ $k[$i] +] = [+ $ENV{$k[$i]} +]<BR>
 [- $i++ -]
 [$ endwhile $]

Dies sendet alle Umgebungsvariablen zum Browser.

HINWEIS: '&lt;' 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.



HTML Tagstop

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">

[ << Prev: DESCRIPTION ] [ Content ] [ Next: Gültigkeitsbereiche von Variablen und Cleanup >> ]


© 1997-2023 Gerald Richter / actevy