I. Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1. Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1. Nachteile der Shells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Nachteile von awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3. Vorteile von Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4. Nachteile von Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5. Alternativen zu Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.6. Dokumentation zu Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.7. Bücher zu Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.8. Noch mehr Bücher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.9. Periodika und Webseiten zu Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2. Erste Schritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1. Skalare Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2. Eingabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3. Ein paar Operationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4. Vorränge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5. Ein erster Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6. Kurzübersicht der Kontrollstrukturen . . . . . . . . . . . . . . . . . . . . . . . 19
2.7. Dateien eröffnen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.8. Formate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3. Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1. Eine erste Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2. Das Durchlaufen einer Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.3. Kontext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.4. Interpolation von Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.5. Kommandozeile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.6. Listen im Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4. Assoziative Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1. defined und exists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2. Assoziative Arrays und Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.3. Das Durchlaufen assoziativer Arrays . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.4. Assoziative Arrays im Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5. Prozeduren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1. Listen als Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.2. Kontext eines Prozeduraufrufs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.3. Anordnung von Prozeduren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

5.4. Sortierkriterien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6. Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.1. Ein Nachbau von grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.2. Parsieren einfacher Textdateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.3. Flexibler Textersatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.4. Modifikatoren im Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.5. Metazeichen in regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . . . . 49
6.6. Quantifikatoren in regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . 50
6.7. Sonderzeichen in regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . . . 51
6.8. Kurzformen in regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . . . . . 52
6.9. Bestimmte Punkte in regulären Ausdrücken . . . . . . . . . . . . . . . . . 53
6.10. Variablen, die von regulären Ausdrücken abhängen . . . . . . . . . . 54
6.11. Der m//-Operator im Listenkontext . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.12. Rückwärtsverweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.13. Voraus- und Rückschau bei regulären Ausdrücken . . . . . . . . . . . 57
6.14. Arbeitsweise bei regulären Ausdrücken . . . . . . . . . . . . . . . . . . . . . . 58
6.15. Neue Techniken bei regulären Ausdrücken . . . . . . . . . . . . . . . . . . . 61
7. Verzeichnisse lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.1. Rekursives Durchwandern des Dateibaums . . . . . . . . . . . . . . . . . . 63
7.2. Dateitest-Operatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7.3. Globs und stat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8. Zeiger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8.1. Eine Liste von Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.2. Speicherallokation mit my . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
8.3. Eine Liste von assoziativen Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8.4. Assoziative Arrays von assoziativen Arrays . . . . . . . . . . . . . . . . . . 72
8.5. Zeiger auf Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.6. Anonyme Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.7. Closures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
8.8. Zeiger im Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
9. Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
9.1. Die Benutzung von Modulen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
9.2. Module, die automatisch Namen exportieren . . . . . . . . . . . . . . . . 80
9.3. Die use-Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.4. Exportlisten ohne Flutung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.5. Mehr Überprüfungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

9.6. Vermeidung symbolischer Zeiger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.7. Mehr Ordnung bei Variablennamen . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.8. Einschränkungen in der Verwendung ungeschützter Namen . . 87
9.9. Ausnahmenbehandlungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
9.10. Ausnahmenbehandlungen im Überblick . . . . . . . . . . . . . . . . . . . . . . 90
10. Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
10.1. Ein Modul als Objekt-Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
10.2. Objekt-Konstruktoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3. Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
10.4. Die Benutzung von Klassen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
11. Dateiverbindungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
11.1. Type-Globs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
11.2. Skalare als Dateiverbindungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
11.3. Dateiverbindungen aus dem Modul IO::File . . . . . . . . . . . . . . . 99
11.4. Verzeichnisverbindungen aus dem Modul IO::Dir . . . . . . . . . . . 100
11.5. Beispiel: Kryptographische Hash-Funktionen . . . . . . . . . . . . . . . . 101
12. Alternative Implementierungen für standardmäßige Datenstrukturen 103
12.1. Assoziative Arrays mit einer alternativen Implementierung . . 104
12.2. DBM-Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
12.3. Beispiel: mkfiledb und findfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
12.4. ASCII-Dateien als assoziative Arrays . . . . . . . . . . . . . . . . . . . . . . . . 110
13. Eingebettete Dokumentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
13.1. Pod-Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
13.2. Pod-Direktiven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
13.3. Pod-Sequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
II. Perl und Datenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
1. Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
1.1. Datenbank-Techniken bei Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
1.2. Abstraktionstechniken für Datenbanken . . . . . . . . . . . . . . . . . . . . . 121
1.3. Standards bei Datenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
1.4. DBI – generelle Schnittstelle für SQL-Datenbanken . . . . . . . . . . 123
2. Frei zugängliche SQL-Implementierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
2.1. MySQL von TCX DataKonsult AB . . . . . . . . . . . . . . . . . . . . . . . . . 125

3. Kurzeinführung in SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
3.1. SQL vs MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
3.2. SQL Übersicht (Auswahl) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
3.3. Datentypen bei SQL (Auswahl) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
3.4. Repräsentierung von Daten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
3.5. Syntax von SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
3.6. ER-Diagramm für die folgenden Beispiele . . . . . . . . . . . . . . . . . . . 132
3.7. Das Anlegen von Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.8. Das Einfügen von Datensätzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
3.9. Die Selektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
3.10. Das Ändern von Datensätzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
3.11. Das Ersetzen von Datensätzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4. Perl/DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.1. Modulstruktur von DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.2. Aufbau einer Verbindung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.3. Die Ausführung von SQL-Anweisungen . . . . . . . . . . . . . . . . . . . . . . 146
4.4. Platzhalter in SQL-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
4.5. Fehlerbehandlung bei DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
4.6. Werkzeug zum Füllen von Datenbanken . . . . . . . . . . . . . . . . . . . . . 149
4.7. Das Abholen von Datensätzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
4.8. Transaktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
4.9. Metainformationen einer Datenbank . . . . . . . . . . . . . . . . . . . . . . . . . 154
4.10. DBI im Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5. Eine Abstraktion für Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
5.1. Übersicht von TBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
5.2. Modulstruktur von TBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
5.3. Initialisierungs-Sequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
5.4. Registrierung bei TBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
5.5. Eröffnen von Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
5.6. Eingebettete Initialisierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
5.7. Schließen von Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
5.8. Generierung von SQL-Anweisungen . . . . . . . . . . . . . . . . . . . . . . . . . 178
6. Sicherheitstips für Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
6.1. Typische Angriffspunkte bei Perl-Skripten . . . . . . . . . . . . . . . . . . . 183
6.2. Generelle Abwehrtechniken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
6.3. Taint-Modus von Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
6.4. Kontaminierung von skalaren Variablen . . . . . . . . . . . . . . . . . . . . . 188

6.5. Dekontaminierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
6.6. Sicherheitsrelevante Operationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
6.7. Abschließende Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
III. Netzdienste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
1. Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
1.1. Netzwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
1.2. Berkeley Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
1.3. Berkeley Sockets: Abstraktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
1.4. Berkeley Sockets: Semantik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
1.5. Berkeley Sockets: Verbindungsaufbau . . . . . . . . . . . . . . . . . . . . . . . . 197
1.6. Berkeley Sockets: Zeitansage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
1.7. Berkeley Sockets: Ein einfacher Klient . . . . . . . . . . . . . . . . . . . . . . . 199
1.8. Berkeley Sockets: Hinweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
2. Socket-Schnittstelle bei Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
2.1. Unterstützung paralleler Klienten-Zugriffe . . . . . . . . . . . . . . . . . . . 204
2.2. Lösung mit mehreren Prozessen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
2.3. Lösung mit einem Prozeß . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
3. Webschnittstelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
3.1. Ein erster Versuch mit HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
3.2. HTTP mit Attributen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
3.3. HTTP-Anfragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
3.4. Adressen von Ressourcen im Internet . . . . . . . . . . . . . . . . . . . . . . . . 225
3.5. Web-Adressen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
3.6. Dynamisch generierte Webseiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
3.7. Ein CGI-Testprogramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
3.8. Test mit GET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
3.9. Test mit POST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
3.10. Formulare in HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
3.11. Das CGI-Modul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
3.12. Such-Index für E-Mail-Adressen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
3.13. Erzeugung der Indizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
3.14. Das suchende CGI-Skript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
3.15. CGI im Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
4. Ein virtuelles Kaufhaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
4.1. Anforderungskatalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
4.2. ER-Diagramm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

4.3. SQL-Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
4.4. Modulhierarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
4.5. Sitzungs-Nummer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
4.6. Weitere Zustandsvariablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
4.7. Methoden der Requests-Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
4.8. Vorgehensweise von Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
4.9. Gestaltungselemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
5. Schnittstellen für Netzdienste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
5.1. Die Net-Hierarchie von Graham Barr . . . . . . . . . . . . . . . . . . . . . . . . 261
5.2. Die Net-Hierarchie von Spider Boardman . . . . . . . . . . . . . . . . . . . . 262
5.3. Die LWP-Hierarchie von Gisle Aas . . . . . . . . . . . . . . . . . . . . . . . . . . 263
5.4. Auswertung eines cgi-Skriptes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
5.5. Literaturhinweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
IV. Perl/Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
1. Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
1.1. Erste Schritte mit Perl/Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
1.2. Graphischer Aufbau einer Anwendung . . . . . . . . . . . . . . . . . . . . . . . 269
1.3. Geometrie-Manager bei Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
1.4. Geometrie-Manager pack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
1.5. Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
1.6. Spezifikation von Ereignissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
1.7. Interessensbekundungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
1.8. Ereignis-Bearbeiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
2. Widgets in Perl/Tk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
2.1. Buttons & Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
2.2. Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
2.3. Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
2.4. Betrachter für kleine Datenbanken . . . . . . . . . . . . . . . . . . . . . . . . . . 292
2.5. Listboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
2.6. Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
2.7. Betrachter für wachsende Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
2.8. Textfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
2.9. Leiste mit Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
2.10. Eine Umgebung für Perl-Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
2.11. Die Bearbeitung eines Plex-Skriptes . . . . . . . . . . . . . . . . . . . . . . . . . 311
2.12. Die Packerei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
2.13. Die Listboxen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
2.14. Auswahl einer Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

2.15. Das Editierfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
2.16. Die Ausführung von Kommandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
2.17. Das Herunterladen von Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
2.18. Herunterladen von Dateien via FTP . . . . . . . . . . . . . . . . . . . . . . . . . 322
3. Models, Viewers und Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
3.1. Informationsflüsse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
3.2. MVC-Modell bei Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
3.3. MVC-Modell bei Applikationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
3.4. MVC-Klassen in Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
3.5. MVC::Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
3.6. MVC::Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
3.7. MVC::Model::Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
3.8. MVC::Viewer::ROText . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335