| Inside Embperl - Wie der Embedded Perl Code intern ausgeführt wird |
Wenn Embperl auf einen Block mit Perl Code trifft
([+/-/!/$ .... $/!/-/+])
führt es folgende Bearbeitungsschritte aus: | 1. Alles, was wie ein HTML Tag aussieht, entfernen. | | 2. Transformieren HTML/URL kodierter Zeichen in entsprechende ASCII Zeichen. | | 3. Entfernen aller Carriage Returns. | | 4. Übersetzen des Perl Codes als eigenständige Funktion. | | 5. Aufrufen der Funktion. | | 6. URL/HTML kodieren von entsprechenden Sonderzeichen im Rückgabewert. | | 7. Senden des Rückgabewertes (an Browser oder Datei etc.) |
Die Schritte 1-4 werden nur beim ersten Mal, wenn Embperl auf den Perl Code
trifft, ausgeführt. Wird die Seite das zweite mal abgerufen, bzw. liegt der Block
in einer Schleife, muß Embperl lediglich die vorkompilierte Funktion
aufrufen. Schritte 6 und 7 werden nur bei Ausgaben, d.h. [+ ... +] Blöcken,
ausgeführt.
| Was bedeutet das im Detail? | top |
Als Beispiel nehmen wir folgenden Code: [+ <BR>
$a = "Dies '>' ist ein Größerzeichen"
<BR> +]
| 1. Entfernen der HTML Tags. Danach sieht es folgendermaßen aus: | top |
[+
$a = "Dies '>' ist ein Größerzeichen"
+] Die <BR>'s in diesem Fall machen keinen Sinn, sie kommen höchstwahrscheinlich
von einem WYSIWYG HTML Editor, dadurch das der Benutzer zur besseren Übersicht
hier eine neue Zeile beginnen wollte.
Solche Editoren fügen u.U. auch ungewollte Tags wie <FONT> o.ä. in den
Perl Code ein. Durch das entfernen solcher Tags, stellt Embperl sicher,
dass Designer, die mit solchen Editoren arbeiten, den Perl Code dadurch
nicht zerstören können. Es gibt auch Fälle, wo HTML Tags wirklich gebraucht werden.
Zum Beispiel:
Nehmen wir an, Sie wollen folgendes Ausgeben: [+ "<FONT COLOR=$col>" +] Ohne weitere Maßnahmen, würde Embperl folgendes daraus machen: [+ "" +] Um aber dennoch HTML Tags zu verwenden gibt es verschiedene Möglichkeiten: | a. <FONT COLOR=[+$col+]> | | | Schreiben Sie nur den wirklich notwendigen Teil innerhalb des [+ ... +]
Blocks und verlagern sie das HTML Tag nach außerhalb.
Dies ist der unproblematischste Weg und sollte wenn immer möglich gewählt
werden. |  | | b. [+ "\<FONT COLOR=$col>" +] | | | Durch Voranstellen eines Backslashs ('\'). |  | | c. [+ "<FONT COLOR=$col>" +] | | | Sie können HTML kodierte Zeichen benutzen.
Die meisten HTML Editoren machen dies automatisch.
(In diesem Fall brauchen Sie sich nicht weiter darum zu kümmern.) |  | | d. Die Option optRawInput setzen. | | | Dies verhindert grundsätzlich das Entfernen von HTML Tags. |  |
HINWEIS: In den Fällen b-d sollten Sie ebenfalls die Ausgabe-HTML-Kodierung
beachten (siehe unten). Zu beachten ist ebenfalls, daß Embperl den Perl Dateihandle Operator (<>)
als HTML Tag interpretiert und ihn damit entfernt. Anstelle von [- $line = <STDIN>; -] sollten Sie eine der folgenden Schreibweise verwenden: | a. [- $line = \<STDIN>; -] | | b. [- $line = <STDIN>; -] |
Benutzen Sie einen High-Level HTML Editor, wird er wahrscheinlich Version (b)
automatisch erzeugen.
| 2. Transformieren HTML/URL kodierter Zeichen in entsprechende ASCII Zeichen. | top |
Da Perl HTML kodierte Zeichen, wie $a < $b, nicht versteht, übersetzt
Embperl dies zu $a < $b. Nehmen wir das Beispiel
von vorhin, dann sieht es jetzt so aus: [+
$a = "Dies '>' ist ein Größerzeichen"
+] Dies dient wiederum der Unterstützung von High-Level Editoren.
Dadurch ist es unerheblich, wenn Ihr Editor > statt > im Quellentext
schreibt. Auch hier ist es manchmal nötig, die HTML kodierten Zeichen zu erhalten.
Dazu bietet Embperl folgende Möglichkeiten: | a. \> | | | Durch Voranstellen eines Backslashs ('\'). |  | | b. &gt; | | | Schreiben Sie das erste '&' als HTML kodiertes Zeichen (&).
Ein HTML Editor wird dies von sich machen, wenn Sie > als Text eingeben. |  | | c. Die Option optRawInput setzen. | | | Dies verhindert grundsätzlich das Dekodieren von HTML kodierten Zeichen. |  |
Da nicht jeder einen High Level oder WYSIWYG HTML Editor benutzt,
gibt es eine Option, um Schritt 1 und 2 vollständig zu sperren.
Durch setzen von optRawInput in EMBPERL_OPTIONS läßt
Embperl den Perl Code unberührt. Diese Option sollten Sie setzen,
wenn Sie einen ASCII Editor benutzen, bei Benutzung eines HTML Editors,
sollte diese Option nicht nötig sein. Sie können optRawInput auch innerhalb Ihres Dokument ein-/ausschalten, indem Sie
$optRawInput 1 oder 0 zuweisen, wobei zu beachten ist, daß die Änderung
erst ab dem nächsten Block wirksam wird. Beispiel: [- $optRawInput = 1 -]
[- $line = <FILEHANDLE> -]
| 3. Entfernen Sie aller Carriage Returns | top |
Embperl entfernt vor dem Übersetzen alle Carriage Returns (\r),
um sicherzustellen, daß Programme die unter DOS/Windows erstellt wurden,
auch unter Perl 5.004 und Unix laufen.
| 4. Übersetzen des Perl Codes als eigenständige Funktion. | top |
Der nächste Schritt generiert eine Funktion aus Ihrem Perl Code.
Das obige Beispiel sieht danach wie folgt aus: sub foo
{
$a = "Dies '>' ist ein Größerzeichen"
} Die Funktion wird vom Perlinterpreter in einem internen vorkompilierten Format
gespeichert und kann
somit später immer wieder aufgerufen werden, ohne die Schritte 1-4 wiederholen
zu müssen. Embperl erkennt, wenn das gleiche Dokument ein zweites mal
angefordert wird und ruft lediglich die
bereits kompilierte Funktion auf. Dadurch wird auch die Ausführung von
dynamischen Tabellen und Schleifen beschleunigt,
da der Perl Code nur bei der ersten Iteration kompiliert werden muss.
| 5. Aufrufen der Funktion | top |
Nun kann die Funktion aufgerufen werden, um den Code tatsächlich auszuführen. Falls nicht ein [+ ... +] Block ausgeführt wird, ist die Bearbeitung
damit abgeschlossen.
| 6. URL/HTML kodieren von entsprechenden Sonderzeichen im Rückgabewert. | top |
Unser Beispiel erzeugt die Zeichenkette: "Dies '>' ist ein Größerzeichen" Das Größerzeichen hier ist normaler Text (und nicht das Ende eines HTML Tags),
gemäss HTML Spezifikation muss es als > zum Browser gesendet werden.
In vielen Fällen entsteht
kein Problem, wenn man direkt das Größerzeichen sendet, da der Browser
höchstwahrscheinlich das '>' als normalen Text ausgeben wird.
In diesem Fall wäre es auch möglich gleich >
in unseren Perl Code schreiben, wenn jedoch die Zeichenkette z.B. Ergebnis
einer Datenbankabfrage ist und/oder nationale Sonderzeichen enthält,
ist es notwendig eine HTML Kodierung der Zeichen durchzuführen. Weiterhin werden Tags, die URLs enthalten (wie <A> oder <FRAME>),
insofern speziell behandelt, als dass Ausgaben innerhalb des Parameters
der die URL enthält, URL kodiert werden. (z.B. wird '&' zu %26 und
Leerzeichen zu '+'). Dies ist nötig, damit der Browser Sonderzeichen
korrekt interpretiert. Beispiel: <A HREF="http://host/script?name=[+$n+]"> Falls $n den Wert "Mein Name" enthält, wird die resultierende URL: http://host/script?name=Mein+Name In einigen Fällen ist es nützlich, die Ausgabekodierung abzuschalten.
Dies kann mit der Variablen $escmode geschehen. Beispiel: (Um das Beispiel einfacher lesbar zu machen,
setzen wir voraus, daß optRawInput gesetzt ist.
Andernfalls sind die in 1 - 3 beschriebenen Punkte zu beachten) [+ "<FONT COLOR=5>" +] Dies würde zum Browser als <FONT COLOR=5> gesandt, was dazu führt
das der Tag exakt so auf dem Bildschirm zusehen ist, statt das sich die
Farbe des folgenden Textes ändert. [+ local $escmode=0 ; "<FONT COLOR=5>" +] Dies schalten die HTML Kodierung (lokal) ab und das Tag wird exakt so wie
Sie es geschrieben haben zum Browser geschickt. HINWEIS: $escmode kann nur einmal innerhalb eines [+ ... +] Blocks
gesetzt werden. Der erste Wert der $escmode zugewiesen wird, gilt für
alle Ausgaben, innerhalb des Blocks. Möchten Sie $escmode hin- und
herschalten, müssen Sie mehrere [+ ... +] Blöcke verwenden.
| 7. Senden des Rückgabewertes (an Browser oder Datei etc.) | top |
An diesem Punkt ist die Ausgabe fertig aufbereitet und kann zum Browser
gesandt werden. Falls Sie nicht die Option optEarlyHttpHeader gesetzt
haben, werden alle Ausgaben bis zur vollständigen Ausführung des Dokuments
zwischengespeichert. Ist das ganze Dokument abgearbeitet, werden zuerst
alle HTTP Header gesendet (dies erlaubt während der Erstellung des Dokuments
zusätzliche HTTP Header hinzuzufügen) und anschließend der eigentliche
Inhalt. Tritt während der Verarbeitung ein Fehler auf, wird statt dem
Inhalt eine Fehlerseite zum Browser gesandt.
|