Die Büro-Am-Draht HTML Perl-Lib

Basics

DBAD.pm
Dies ist die Library, die von den anderen scripten included werden muss.

Example 0
Minimales Script ("use DBAD").
Ausfuehrungszeit auf orion zwischen 0.23 und 0.59, im Mittel 0.30.
(Für alle Zeiten gilt: Die scripte wurden von der Kommandozeile aufgerufen, input und output wurden über dev/null abgewickelt.)
Example 0b
Minimales Script ("use DBAD, use CGI"). Ausfuehrungszeit auf orion zwischen 0.50 und 0.93.

Extensible Substitution-Engine

Nachschlagewerk: Substitution-Engine
Das grosse Nachschlagewerk.
Example 4
Tagged Replacement mit der "neuen" Engine. Führt die vordefinierten Tags INS, LOOP, PROTO und USE vor.
Example 5 (Tutorial: REPEAT)
Beispiel für das REPAT-tutorial.
Example 6 (Tutorial: REPEAT mit Environment-Manipulation)
Beispiel für das REPAT-tutorial.
Example 7: INCLUDE, PROTO, USE mit PARAM
Zeigt das Arbeiten mit (externen) PROTOs, und wie PARAMs und INSerts zusammenarbeiten.
Example 8: FOR
Definiert und exemplifiziert eine FOR-Schleife (ist jetzt auch Teil der DBAD). Das Besondere an der For-Schleife sind die Schleifenvariablen als L-Values. Ach ja: die For-Schleife kann nicht endlos laufen, sie hat eine eingebaut Bremse! Ebenfalls vorgeführt wird das Substituieren in Tags mit ?PARAM=EXPR. Wenn die EXPR einen undefinierten Wert liefert, entfällt das Tag ganz.
Example 9: Array
Liest ein Array ein und zeigt es als Tabelle an. Demonstriert die Array-Klasse der DBAD-Lib.
Example 10: Formulare und Parameter
Zeigt die Benutzung von Formularen und Parametern. Insbesondere zeigt es, wie man eine input-funktion schreibt, die die default-logik der CGI.pm-Formulare imitiert. Zeigt auch, wie man mit einem FOREACH das %ENV ausliest.
Example 11: Parsen von Standard-Elementen
Zeigt, wie man "normales" HTML parsiert und mit der apply_html_tree-Funktion manipuliert. Dieses Beispiel sollte vom Terminal aus gestartet oder mit "View Source" betrachtet werden.

Historisches

Substitutieren

Example 1
Einfache Substitutinen auf einem Input-File (kein HTML-Support). Benutzt CGI.pm; Ausfuehrungszeit auf orion zwischen 2.24 und 3.52.
Example 1b
Variante von 1, in der die replacement-liste ein separates objekt ist.

Auslieferungsform

Die "Export"-Form der DBAD-Library
Wird jedesmal neu erzeugt, wenn das Obfuscation-Script abläuft. Wenns 2mal durchläuft, funktioniert. Noch kanns nicht viel: kommentare löschen und whitespace entfernen. Problematisch: Kommentarzeichen (#) in Strings und Pattern.

Geschwindigkeitsuntersuchungen

Analyse von Example11

Snippets

Count Stuff
Ein verbessertes "wc", das einen ganzen Baum rekursive abzählt. Gut parametrierbar: welche Files sind "binary" (Wörter werden nicht gezählt), welche sind ganz zu ignorieren (CVS, backup-files, templates), was wird gezählt (beliebige regexprs). Dieses Skript kann als Vorlage für alle Arten von file-tree-traversals mit suchen oder search/replace dienen. Benutzt von der DBAD nur die read_file Funktion, ist also weitgehend autark.
Actualize
Eine Variante des o.g. Skripts, in wenigen Minuten zurechtgestutzt: Substitutionen in Files. Wurde eingesetzt, um im Shop verteile Variablen umzubenennen.
Uniq
Erzeugt eine Unique Number.
Evolution eines Skripts
show-text.pl
Ein einfaches Skript: gegeben ein Pfad, wird das file als quoted text angezeigt. Funktion hier: Perl-Code als Text ansehen. High-Performance, da es auf keine externe Lib zugreift (nicht einmal CGI), und einfach: keine Optionen, nur ein Argument. 25 Zeilen.
show-text.pl (Komplex)
Und hier sieht man, was passiert, wenn die creeping featuritis einsetzt: was ist, wenn man Zeilennummern haben will? Das grösste Problem dabei sind nicht die eigentlichen Zeilennummern, sondern das User Interface, also das Parsen der Zeilennummern. Ordentlich gewachsen, 47 Zeilen.
show-text.pl (Komplex, mit Markierung)
Und hier gerät es völlig ausser Kontrolle: man kann einzelne Zeilen "markiert" darstellen. Interessanterweise ist dieses Feature leicht einzubauen, weil die Argument-Parsier-Infrastruktur bereits steht. Das ist auch das erste Mal, dass ich das "..."-Feature von Perl sinnvoll einsetzen kann. (71 Zeilen)
show-text.pl (Komplex, mit Markierung und Farbauswahl)
Die letzten noch wünschbaren Features sind jetzt eingebaut (naja, die Fontwahl fehlt vielleicht noch ;-) Der nächste Schritt bestände aus weitergehenden Markierungsmöglichkeiten und Markierungsklassen (Keywords? Strings?), die dann vermutlich erst mit Regexprs oder einer Dokumentengrammatik zu lösen wären. Das wär dann ein echtes Projekt.

Jetzt muss zum ersten Mal eine Funktion eingeführt werden: mkcolor bringt eine Farbkonstante in die richtige Form (es erkennt, ob es sich um eine hexzahl handelt, und setzt ein hash davor. Bei der Parameterübergabe gibt es sonst Probleme). Alles andere ist immer noch ein straight-line Code.

In diesem letzten Stadium hat das Skript die maximale Grösse eines Monolithen erreicht: es beginnt, unübersichtlich zu werden, und alle weiteren Erweiterungen erfordern eine gut durchdachte Architektur.

eval-expr.pl
Zeigt die "eval" und "perl"-Kommandos.