Home : Dokumentation : 1.3.6 Dokumentation : HTML::Embperl
Google Web perl.apache.org

 
Home
 
Features
 
Einführung
 
Dokumentation
 
README
 
README.v2
 
Konfiguration
 
Embperl
 
Embperl::Object
 
Embperl::Form::Validate
 
Embperl::Syntax
 
Embperl::Recipe
 
Embperl::Mail
 
1.3.6 Dokumentation
 
HTML::Embperl
 
HTML::EmbperlObject
 
HTML::Embperl::Mail
 
HTML::Embperl::Session
 
Tips & Tricks
 
FAQ
 
DBIx::Recordset
 
Installation
 
Download
 
Support
 
Änderungen
 
Wiki
 
Weitere Infos
 
Hinzufügen Infos
 
Login

    Stable 2.4.0
    Beta 2.5.0_3
Unterstützen Sie Embperl! Mehr...
Inside Embperl - Wie der Embedded Perl Code intern ausgeführt wird
[ << Prev: Ein-/Ausgabefunktionen ] [ Content ] [ Next: Performance >> ]

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 '&gt;' ist ein  Größerzeichen"
 <BR> +]


1. Entfernen der HTML Tags. Danach sieht es folgendermaßen aus:top
 [+
 $a = "Dies '&gt;' 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. [+ "&lt;FONT COLOR=$col&gt;" +]

 

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 = &lt;STDIN&gt;; -]

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 &lt; $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 &gt; statt > im Quellentext schreibt.

Auch hier ist es manchmal nötig, die HTML kodierten Zeichen zu erhalten. Dazu bietet Embperl folgende Möglichkeiten:

 

a. \&gt;

 

Durch Voranstellen eines Backslashs ('\').

 

b. &amp;gt;

 

Schreiben Sie das erste '&' als HTML kodiertes Zeichen (&amp;). Ein HTML Editor wird dies von sich machen, wenn Sie &gt; 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 Returnstop

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 Funktiontop

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 &gt; 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 &gt; 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 &lt;FONT COLOR=5&gt; 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.


[ << Prev: Ein-/Ausgabefunktionen ] [ Content ] [ Next: Performance >> ]

© 1997-2012 Gerald Richter / ecos gmbh