Einführung in Perl

Einführung in Perl

Randal L. Schwartz

Tom Phoenix

brian d foy

Jørgen W. Lang

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

Alle Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Der Verlag richtet sich im wesentlichen nach den Schreibweisen der Hersteller. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Kommentare und Fragen können Sie gerne an uns richten:

Copyright:

6. Auflage 2012

Die Darstellung eines Lamas im Zusammenhang mit dem Thema
Perl ist ein Warenzeichen von O’Reilly Media, Inc.

Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der
Deutschen Nationalbibliografie; detaillierte bibliografische Daten
sind im Internet über http://dnb.d-nb.de abrufbar.

Lektorat: Volker Bombien, Köln
Korrektorat: Astrid Sander, Köln
Satz: III-Satz, Husby; www.drei-satz.de
Umschlaggestaltung: Michael Oreal, Köln
Produktion: Andrea Miß, Köln
Belichtung, Druck und buchbinderische Verarbeitung:
Druckerei Kösel; Krugzell, www.koeselbuch.de

Dieses Buch ist auf 100% chlorfrei gebleichtem Papier gedruckt.

O’Reilly Verlag Balthasarstr. 81 50670 Köln kommentar@oreilly.de

Kapitel 13. Zugriff auf Verzeichnisse

Vorwort

Typografische Konventionen

Verwendung der Codebeispiele

Die Geschichte dieses Buchs

Veränderungen in dieser Auflage

Danksagungen

Von Randal

Von Tom

Von brian

Von uns allen

1. Einleitung

Fragen und Antworten

Ist dies das richtige Buch für Sie?

Warum gibt es so viele Fußnoten?

Was ist mit den Übungen und ihren Lösungen?

Was bedeuten die Zahlen am Anfang der Übungen?

Wie soll ich als Perl-Dozent vorgehen?

Was bedeutet »Perl«?

Warum schuf Larry Perl?

Warum hat Larry nicht einfach eine andere Sprache benutzt?

Ist Perl nun schwer oder leicht?

Warum ist Perl so beliebt?

Was geschieht in Zukunft mit Perl?

Wofür ist Perl eigentlich geeignet?

Wofür ist Perl nicht geeignet?

Wo kann ich Perl bekommen?

Was ist das CPAN?

Wo bekomme ich Support für Perl?

Gibt es auch noch andere Arten von Support?

Was soll ich tun, wenn ich einen Bug in Perl entdecke?

Wie schreibe ich ein Perl-Programm?

Ein einfaches Programm

Was passiert im Innern des Programms?

Wie kann ich mein Perl-Programm kompilieren?

Eine Perl-Blitztour

Übungen

2. Skalare Daten

Zahlen

Alle Zahlen haben intern das gleiche Format

Fließkomma-Literale

Ganzzahlige Literale

Nichtdezimale ganzzahlige Literale

Numerische Operatoren

Strings

Strings in einfachen Anführungszeichen

Strings in doppelten Anführungszeichen

Operatoren für Strings

Automatische Umwandlung zwischen Zahlen und Strings

Eingebaute Warnungen

Skalare Variablen

Einen guten Variablennamen auswählen

Skalare Zuweisung

Binäre Zuweisungsoperatoren

Ausgaben mit print

Interpolation von skalaren Variablen in Strings

Mit Codepoint Zeichen erzeugen

Präzedenz und Assoziativität der Operatoren

Vergleichsoperatoren

Kontrollstrukturen mit if

Boolesche Werte

Auf Benutzereingaben reagieren

Der chomp-Operator

Kontrollstrukturen mit while

Der Wert undef

Die Funktion defined

Übungen

3. Listen und Arrays

Zugriff auf Arrayelemente

Besondere Arrayindizes

Listenliterale

Die Schreibweise mit qw abkürzen

Listenzuweisung

pop und push

shift und unshift

splice

Interpolation von Arrays in Strings

Kontrollstrukturen mit foreach

Die beliebteste Standardvariable in Perl: $_

Der reverse-Operator

Der sort-Operator

Der each-Operator

Skalarer Kontext und Listenkontext

Ausdrücke, die eine Liste zurückgeben, in skalarem Kontext benutzen

Ausdrücke, die Skalare erzeugen, im Listenkontext benutzen

Skalaren Kontext erzwingen

<STDIN> im Listenkontext

Übungen

4. Subroutinen

Subroutinen definieren

Subroutinen aufrufen

Rückgabewerte

Argumente

Private Variablen in Subroutinen

Parameterlisten mit variabler Länge

Eine bessere &max-Subroutine

Leere Parameterlisten

Anmerkungen zu lexikalischen (my)-Variablen

Das »use strict«-Pragma

Der return-Operator

Das Ampersand-Zeichen weglassen

Nicht-skalare Rückgabewerte

Persistente private Variablen (Zustandsvariablen)

Übungen

5. Eingabe und Ausgabe

Eingaben von der Standardeingabe (STDIN)

Eingaben vom Diamantoperator

Aufrufende Argumente

Ausgaben auf STDOUT

Formatierte Ausgaben mit printf

Arrays und printf

Datei-Handles

Datei-Handles öffnen

binmode auf Datei-Handles anwenden

Schlechte Datei-Handles

Datei-Handles schließen

Schwerwiegende Fehler mit die abfangen

Warnhinweise ausgeben mit warn

Automatisches die-en

Datei-Handles benutzen

Das Standard-Datei-Handle für Ausgaben ändern

Standard-Datei-Handles erneut öffnen

Ausgaben mit say

Datei-Handles in Skalaren

Übungen

6. Hashes

Was ist ein Hash?

Warum einen Hash benutzen?

Zugriff auf Hash-Elemente

Der Hash als Ganzes

Hash-Zuweisung

Der große Pfeil

Hash-Funktionen

Die Funktionen keys und values

Die Funktion each

Typische Anwendung für einen Hash

Die Funktion exists

Die Funktion delete

Interpolation von Hash-Elementen

Der %ENV-Hash

Übungen

7. Die Welt der regulären Ausdrücke

Was sind reguläre Ausdrücke?

Einfache Mustererkennung

Unicode-Eigenschaften

Über Metazeichen

Einfache Quantifier

Muster gruppieren

Alternativen

Zeichenklassen

Abkürzungen in Zeichenklassen

Negierte Abkürzungen

Übungen

8. Mustersuche mit regulären Ausdrücken

Mustervergleiche mit m//

Das Standardverhalten von regulären Ausdrücken ändern

Groß- und Kleinschreibung ignorieren mit /i

Ein beliebiges Zeichen finden mit /s

Leerzeichen einfügen mit /x

Modifier kombinieren

Eine Lesart für Zeichen auswählen

Weitere Option-Modifier

Muster verankern

Wörter verankern

Der Bindungsoperator =~

Variableninterpolation in Suchmustern

Die Speichervariablen

Persistenz des Speichers

Runde Klammern ohne Speicherfunktion

Benannte Speichervariablen

Die automatischen Speichervariablen

Allgemeine Quantifier

Präzedenz

Beispiele für Präzedenz

Und es gibt noch mehr ...

Ein Programm zum Testen von Mustern

Übungen

9. Textbearbeitung mit regulären Ausdrücken

Ersetzungen mit s///

Globales Ersetzen mit /g

Andere Begrenzungszeichen

Ersetzungsmodifier

Der Bindungsoperator

Nichtdestruktive Ersetzung

Groß- und Kleinschreibung ändern

Der split-Operator

Die join-Funktion

m// im Listenkontext

Weitere mächtige reguläre Ausdrücke

Nicht-gierige Quantifier

Treffer in mehrzeiligem Text finden

Mehrere Dateien auf einmal aktualisieren

Editieren an Ort und Stelle von der Kommandozeile aus

Übungen

10. Weitere Kontrollstrukturen

Kontrollstrukturen mit unless

else und unless kombinieren

Kontrollstrukturen mit until

Ausdrücke modifizieren

Nackte Blöcke als Kontrollstrukturen

Die elsif-Klausel

Autoinkrement und Autodekrement

Der Wert von Autoinkrement-Operationen

Kontrollstrukturen mit for

Die geheime Verbindung zwischen foreach und for

Schleifen kontrollieren

Der last-Operator

Der next-Operator

Der redo-Operator

Benannte Blöcke

Der Bedingungsoperator ?:

Logische Operatoren

Der Wert von Short-Circuit-Operatoren

Der Definiert-oder-Operator

Kontrollstrukturen mit teilweise auswertenden Operatoren

Übungen

11. Perl-Module

Module finden

Module installieren

Eigene Verzeichnisse verwenden

Einfache Module benutzen

Das Modul File::Basename

Nur bestimmte Funktionen eines Moduls verwenden

Das Modul File::Spec

Path::Class

CGI.pm

Datenbanken und DBI

Datum und Uhrzeit

Übungen

12. Dateitests

Dateitest-Operatoren

Mehrere Attribute einer Datei auf einmal überprüfen

Dateitests stapeln

Die Funktionen stat und lstat

Die Funktion localtime

Bitorientierte Operatoren

Mit Bitstrings arbeiten

Übungen

13. Zugriff auf Verzeichnisse

Im Verzeichnisbaum navigieren

Globbing

Eine alternative Globbing-Syntax

Verzeichnishandles

Verzeichnisse rekursiv bearbeiten

Dateien und Verzeichnisse bearbeiten

Dateien löschen

Dateien umbenennen

Links und Dateien

Anlegen und Entfernen von Verzeichnissen

Zugriffsrechte ändern

Besitzrechte ändern

Zeitstempel ändern

Übungen

14. Strings und Sortierfunktionen

Substrings finden mit index

Substrings manipulieren mit substr

Daten mit sprintf formatieren

»Geld«-Werte mit sprintf formatieren

Nicht-Dezimalzahlen interpretieren

Fortgeschrittenes Sortieren

Hashes abhängig von den Werten sortieren

Nach mehreren Kriterien sortieren

Übungen

15. Intelligente Vergleiche und given-when

Der Operator für intelligente Vergleiche

Präzedenz bei intelligenten Vergleichen

Die given-Anweisung

»Dumme« Vergleiche

when mit vielen Elementen verwenden

Übungen

16. Prozessverwaltung

Die Funktion system

Die Shell vermeiden

Die Funktion exec

Umgebungsvariablen

Backquotes zum Abfangen von Ausgaben benutzen

Backquotes im Listenkontext benutzen

Externe Prozesse mit IPC::System::Simple

Prozesse als Datei-Handles

Ganz tief unten mit fork

Signale schicken und empfangen

Übungen

17. Fortgeschrittene Perl-Techniken

Fehler mit eval abfangen

Fortgeschrittene Fehlerbehandlung

autodie

Elemente mit grep aus einer Liste filtern

Listenelemente umwandeln mit map

Spezielle Werkzeuge für Listen

Slices

Array-Slices

Hash-Slices

Übung

A. Lösungen zu den Übungen

Lösungen zu den Übungen in Kapitel 1

Lösungen zu den Übungen in Kapitel 2

Lösungen zu den Übungen in Kapitel 3

Lösungen zu den Übungen in Kapitel 4

Lösungen zu den Übungen in Kapitel 5

Lösungen zu den Übungen in Kapitel 6

Lösungen zu den Übungen in Kapitel 7

Lösungen zu den Übungen in Kapitel 8

Lösungen zu den Übungen in Kapitel 9

Lösungen zu den Übungen in Kapitel 10

Lösungen zu den Übungen in Kapitel 11

Lösungen zu den Übungen in Kapitel 12

Lösungen zu den Übungen in Kapitel 13

Lösungen zu den Übungen in Kapitel 14

Lösungen zu den Übungen in Kapitel 15

Lösungen zu den Übungen in Kapitel 16

Lösung zu der Übung in Kapitel 17

B. Über das Lama hinaus

Weiterführende Dokumentation

Reguläre Ausdrücke

Packages

Die Funktionalität von Perl erweitern

Bibliotheken

Module

Module finden und installieren

Eigene Module schreiben

Datenbanken

Direkter Zugriff auf Systemdatenbanken

Zugriff auf textbasierte (»Flatfile«) Datenbanken

Weitere Operatoren und Funktionen

Transliterationen mit tr///

Here-Dokumente

Mathematik

Fortgeschrittene mathematische Funktionen

Abstrakte und komplexe Zahlen

Große Zahlen und Zahlen hoher Präzision

Listen und Arrays

map und grep

Bits und Bytes

Formate

Netzwerke und Interprozess-Kommunikation (IPC)

System V IPC

Sockets

Sicherheit

Debugging

Kommandozeilenoptionen

Eingebaute Variablen

Syntaxerweiterungen

Referenzen

Komplexe Datenstrukturen

Objektorientierte Programmierung

Anonyme Subroutinen und Closures

Gebundene Variablen

Operatoren überladen

Dynamisches Laden

Einbetten

Andere Sprachen nach Perl konvertieren

find-Kommandozeilen nach Perl konvertieren

Kommandozeilenoptionen in Ihren Programmen

Eingebettete Dokumentation

Weitere Möglichkeiten, Datei-Handles zu öffnen

Threads und Forking

Grafische Benutzerschnittstellen (GUIs)

Und mehr ...

C. Das kleine Unicode-ABC

Unicode

UTF-8 & Co.

Alle Beteiligten auf Augenhöhe bringen

Extravagante Zeichen

Noch extravagantere Zeichen

Unicode in Perl verarbeiten

Unicode im Quelltext verwenden

Noch extravagantere Zeichen mit Namen

STDIN oder STDERR lesen bzw. schreiben

Dateien schreiben und lesen

Mit Kommandozeilenargumenten umgehen

Mit Datenbanken umgehen

Weiterführende Literatur

D. Über die Autoren

E. Über den Übersetzer

Stichwortverzeichnis

Kolophon

Vorwort

Willkommen zur 6. Auflage von Einführung in Perl, aktualisiert auf Perl 5.14. Sie können dieses Buch aber auch problemlos benutzen, wenn Sie noch mit Perl 5.8 arbeiten (wobei seine Veröffentlichung mittlerweile schon so lange her ist, dass Sie vielleicht über ein Update nachdenken sollten).

Wenn Sie nach der besten Möglichkeit suchen, die nächsten 30 bis 45 Stunden mit der Programmiersprache Perl zu verbringen, hat Ihre Suche hier ein Ende. Auf den folgenden Seiten finden Sie eine sorgfältig abgestimmte Einleitung in die Sprache, die als das »Arbeitspferd des Internet« sowie als die Sprache der Wahl bei Systemadministratoren, Web-Hackern und Gelegenheitsprogrammierern auf der ganzen Welt gilt.

Wir können Ihnen natürlich nicht den gesamten Umfang von Perl in ein paar Stunden beibringen. Bücher, die Ihnen das versprechen, übertreiben ein bisschen. Stattdessen haben wir sorgfältig einen nützlichen Querschnitt von Perl für Sie ausgewählt. Dieser reicht aus, um Anwendungen mit einer Länge von einer bis zu 128 Zeilen zu schreiben, die ungefähr 90% aller Programme ausmachen. Wenn Sie dieses Buch durchgearbeitet haben, können Sie sich das Alpaka-Buch besorgen, das dort anschließt, wo das Ihnen hier vorliegende Lama-Buch aufhört. Wir haben außerdem eine Reihe von weiterführenden Hinweisen mit aufgenommen, die Ihnen weiterhelfen sollen, wenn Sie sich mit spezielleren Perl-Themen befassen wollen.

Jedes Kapitel ist kurz genug, um in einer bis zwei Stunden gelesen zu werden, und endet mit einer Reihe von Übungen, die Ihnen helfen sollen, das Gelernte anzuwenden. Die Antworten haben wir für Sie zur Überprüfung in Anhang A zusammengestellt. Dieses Buch ist also ideal für Perl-Einführungskurse und -seminare geeignet. Wir wissen dies aus erster Hand, da das Material für dieses Buch fast Wort für Wort aus dem Konzept für unseren Perl-Einführungskurs stammt, den mittlerweile Tausende von Kursteilnehmern in aller Welt absolviert haben. Dennoch ist dieses Buch natürlich auch für das Selbststudium geeignet.

Perl wird oft als der »Werkzeugkasten für Unix« bezeichnet, aber Sie müssen kein Unix-Guru sein, nicht einmal Unix-Benutzer, um mit diesem Buch Perl lernen zu können. Sofern es nicht extra vermerkt ist, gilt alles, was wir sagen, auch für die Windows-Version ActivePerl von ActiveState und für andere moderne Implementierungen von Perl.

Auch wenn Sie zu Beginn der Lektüre dieses Buchs keinerlei Ahnung von Perl haben müssen, ist es empfehlenswert, sich bereits mit grundsätzlichen Konzepten des Programmierens auszukennen. Hierzu zählen etwa Variablen, Schleifen, Unterroutinen, Arrays und das ganz wichtige »eine Quellcode-Datei mit Ihrem Lieblings-Texteditor bearbeiten«. Diese Konzepte setzen wir voraus. Auch wenn es uns freut zu hören, dass der eine oder andere mit diesem Buch Perl als erste Programmiersprache gelernt hat, können wir nicht allen Lesern versprechen, dass sie das ebenfalls hinbekommen.

Typografische Konventionen

Die folgenden typografischen Konventionen werden in diesem Buch verwendet:

Nichtproportionalschrift

wird für Namen von Methoden, Funktionen, Variablen und Attributen sowie für Codebeispiele verwendet.

Nichtproportionalschrift fett

wird verwendet, wenn User-Eingaben dargestellt werden sollen.

Nichtproportionalschrift kursiv

steht für austauschbare Codeelemente (zum Beispiel Dateiname, wenn der tatsächliche Dateiname eingesetzt werden soll).

Kursivschrift

wird benutzt für Dateinamen, URLs, Rechnernamen, wichtige Begriffe bei ihrer ersten Erwähnung und zur Hervorhebung von Textteilen.

Fußnoten

enthalten zusätzliche Anmerkungen, die Sie beim ersten Lesen dieses Buchs nicht mitlesen sollten (sondern vielleicht beim zweiten oder dritten Mal). Manchmal wird im Text bewusst ein wenig die Unwahrheit gesagt, um die Erklärungen zu vereinfachen, und eine Fußnote stellt dann alles wieder richtig. Oft enthalten Fußnoten auch Hinweise auf weiterführendes Material, das in diesem Buch gar nicht weiter behandelt wird.

[2], [5] usw.

am Anfang der Texte zu den Übungen stellen grobe Schätzungen dar, wie viele Minuten Sie voraussichtlich mit der jeweiligen Übung verbringen werden.

Verwendung der Codebeispiele

Dieses Buch soll Ihnen dabei helfen, Ihre Arbeit zu erledigen. Sie können den Code aus diesem Buch benutzen und an Ihre eigenen Bedürfnisse anpassen. Wir empfehlen Ihnen allerdings, ihn nicht von Hand zu kopieren, sondern unter http://www.learning-perl.com herunterzuladen.

Den Code, den wir hier zeigen, dürfen Sie im Allgemeinen in Ihren Programmen und in Ihrer Dokumentation verwenden. Sie brauchen uns nicht um Genehmigung bitten, sofern Sie nicht große Teile des Codes reproduzieren. Wenn Sie zum Beispiel ein Programm schreiben, das mehrere Codestücke aus diesem Buch wiederverwendet, brauchen Sie uns nicht um Erlaubnis zu bitten, wenn Sie jedoch eine CD mit Codebeispielen aus O’Reilly-Büchern verkaufen oder vertreiben wollen, müssen Sie eine Genehmigung einholen. Eine Frage mit einem Zitat aus diesem Buch und seinen Codebeispielen zu beantworten erfordert keine Erlaubnis, aber es ist ohne Genehmigung nicht gestattet, große Teile unseres Textes oder Codes in eine eigene Produktdokumentation aufzunehmen.

Wir freuen uns über eine Quellenangabe, verlangen sie aber nicht unbedingt. Zu einer Quellenangabe gehören normalerweise Autor, Titel, Verlag und ISBN, zum Beispiel so: »Randal L. Schwartz, Tom Phoenix & brian d foy: Einführung in Perl, 6. Auflage, O’Reilly Verlag 2011, ISBN 978-3-868 99-145-1«.

Die Geschichte dieses Buchs

Für die Neugierigen unter Ihnen folgt nun Randals Version der Entstehungsgeschichte dieses Buchs.

Nachdem Larry Wall und ich 1991 mit der Arbeit an der 1. Auflage von Programming perl fertig waren, wurde ich von der Firma Taos Mountain Software im Silicon Valley angesprochen, einen Perl-Kurs zu entwickeln. Hierzu gehörte auch das erste Dutzend Kurse, um Ausbilder dieser Firma auszubilden, diesen Kurs zu halten. Ich schrieb also diesen Kurs und gab ihn, wie vereinbart, an die Firma[1] weiter.

Als ich den Kurs das dritte oder vierte Mal hielt (Ende 1991), kam jemand auf mich zu und sagte: »Weißt du, ich finde ja Programming Perl wirklich gut, aber die Art, wie das Material hier im Kurs aufbereitet wird, ist viel leichter nachzuvollziehen. Du solltest ein Buch schreiben, das wie dieser Kurs aufgebaut ist.« Das schien mir eine gute Idee, und so begann ich, darüber nachzudenken.

Ich schrieb an Tim O’Reilly und schlug ihm ein Buch vor, das sich in den Grundzügen an dem Kurs orientierte, den ich für Taos entwickelt hatte. Allerdings habe ich einige Kapitel, nach Beobachtungen im Kursraum, etwas umstrukturiert und geändert. Ich glaube, schneller ist noch nie ein Buchvorschlag von mir angenommen worden: Bereits 15 Minuten später erhielt ich eine Nachricht von Tim: »Wir haben schon darauf gewartet, dass du ein zweites Buch einreichst – Programming perl verkauft sich wie verrückt.« Die folgenden 18 Monate verbrachte ich dann damit, die 1. Auflage von Learning Perl fertig zu stellen.

Während dieser Zeit begann ich, eine Gelegenheit zu sehen, Perl auch außerhalb des Silicon Valley[2] zu lehren. Also entwickelte ich einen Kurs, der auf dem Text basierte, den ich für Learning Perl geschrieben hatte. Ich gab ein Dutzend Kurse für verschiedene Kunden (unter anderem auch für meinen Hauptauftraggeber, Intel Oregon) und benutzte die Rückmeldungen, die ich bekam, um der Rohfassung des Buchs den letzten Schliff zu geben.

Die 1. Auflage kam am 1. November 1993[3] in die Läden und wurde zu einem überwältigenden Erfolg, dessen Verkaufszahlen oft sogar die von Programming perl übertrafen.

Auf der Rückseite der 1. Auflage stand zu lesen: »Geschrieben von einem der führenden Perl-Trainer«. Das wurde schnell zu einer sich selbst erfüllenden Prophezeiung. Innerhalb von wenigen Monaten bekam ich E-Mails von Leuten überall aus den USA, die mich darum baten, für ihre Firmen Kurse zu geben. Während der folgenden sieben Jahre entwickelte sich meine Firma zum weltweiten Marktführer für Perl-Training vor Ort, und ich sammelte eine Million Vielflieger-Meilen. Es kam auch nicht ungelegen, dass es während dieser Zeit so richtig mit dem Web losging. Bei Webmastern und -meisterinnen wurde Perl die bevorzugte Sprache für Content-Management, Benutzerinteraktion mit CGI und die Pflege von Sites.

Zwei Jahre arbeitete ich bei Stonehenge ziemlich eng mit Tom Phoenix zusammen. Ich gab ihm Freiraum, mit dem »Lama«-Kurs herumzuexperimentieren, einige Dinge umzustellen und anders aufzuteilen. Als wir mit dem fertig waren, was wir als die beste große Revision dieses Kurses ansahen, rief ich Tim O’Reilly an und sagte: »Zeit für ein neues Buch!« Das Ergebnis war die 3. Auflage dieses Buchs.

Zwei Jahre nach der 3. Auflage des Lama-Buchs beschlossen Tom und ich, dass es an der Zeit sei, auch unseren Fortgeschrittenen-Kurs als Buch herauszubringen. Und so entstand das Alpaka-Buch, Einführung in Perl-Objekte, Referenzen & Module, das 2004 erschien (www.oreilly.de/catalog/lrnperlormger/).

Zu dieser Zeit kam unser Kollege brian d foy vom Einsatz im Golfkonflikt zurück; ihm war aufgefallen, dass beide Bücher ein wenig Anpassung gebrauchen konnten, um die veränderten Bedürfnisse der Leser bzw. Lernenden besser zu berücksichtigen. Also schlug er O’Reilly vor, Lama und Alpaka noch ein (hoffentlich) letztes Mal vor Perl 6 in einer neuen Auflage herauszugeben. Die vorliegende Auflage von Einführung in Perl spiegelt diese Veränderungen wider. brian war dabei der Hauptautor und hat großartige Arbeit geleistet, das Team aus mehreren Autoren zu organisieren.

Am 18. Dezember 2007 veröffentlichten die Perl-Portierer Perl 5.10, eine bedeutsame neue Version mit zahlreichen neuen Features. Bei der Vorgängerversion 5.8 war es hauptsächlich um Unicode-Unterstützung gegangen. Die neue Version, die auf der stabilen 5.8 aufbaute, hatte ganz neue Features zu bieten, von denen einige schon aus der Entwicklung des noch nicht veröffentlichten Perl 6 stammten. Ein paar dieser Features, zum Beispiel benannte Captures in regulären Ausdrücken, sind in ihrer Funktionsweise den alten haushoch überlegen und dadurch ideal für Perl-Anfänger. Wir hatten nie eine fünfte Auflage dieses Buches geplant, aber Perl 5.10 hat so viele neue Features zu bieten, dass wir einfach nicht widerstehen konnten.

Seitdem ist Perl fortlaufend verbessert worden und hat einen regelmäßigen Release-Zyklus aufzuweisen. Wir hatten keine Gelegenheit dazu, das Buch für Perl 5.12 zu überarbeiten, weil die Entwicklung zu schnell voranging. Wir freuen uns, Ihnen die vorliegende Überarbeitung für Perl 5.14 präsentieren zu können, und können selbst kaum fassen, dass es jetzt schon die 6. Auflage gibt.



[1] In dem Vertrag behielt ich mir die Rechte an den Übungen vor, in der Hoffnung, diese eines Tages woanders, etwa in den Zeitschriftenkolumnen, die ich zu der Zeit schrieb, wiederverwenden zu können. Die Übungen sind das Einzige, das aus dem Taos-Kurs in diesem Buch verwendet wird.

[2] Mein Vertrag mit Taos enthielt eine Klausel, nach der ich meinem Auftraggeber keine Konkurrenz machen durfte. Ich musste mich also vom Silicon Valley fern halten, was ich auch viele Jahre lang respektiert habe.

[3] An diesen Tag erinnere ich mich gut – es war der Tag, an dem man mich zu Hause wegen Computeraktivitäten im Zusammenhang mit meinem Intel-Vertrag verhaftete. Es wurde eine Reihe von Anklagen erhoben, für die ich später auch verurteilt wurde. Details finden Sie unter http://www.lightlink.com/fors/.

Veränderungen in dieser Auflage

Ihnen werden vermutlich einige Unterschiede zur letzten Auflage auffallen. Der Text wurde auf Perl 5.14 aktualisiert. Einiger Code in diesem Buch funktioniert nur mit dieser Version. Wir weisen im Text darauf hin, wenn wir über Perl 5.14-Features sprechen, und die entsprechenden Codeabschnitte sind mit einem use-Statement markiert, damit Sie auch die richtige Version verwenden:

use 5.014; # dieses Skript setzt Perl 5.14 oder höher voraus

Wenn Sie nicht diesen Hinweis vorfinden, sollte der Code bis hinunter zu Perl 5.8 lauffähig sein. Um in Erfahrung zu bringen, mit welcher Perl-Version Sie arbeiten, verwenden Sie folgenden Befehl:

$ perl -v

Hier ist eine Liste mit einigen der neuen Features in Perl 5.14, die behandelt werden. Wo es angebracht ist, erklären wir aber auch, wie man dasselbe in älteren Versionen bewerkstelligt.

Danksagungen

Von Randal

Ich möchte mich bei den früheren und jetzigen Stonehenge-Trainern (Joseph Hall, Tom Phoenix, Chip Salzenberg, brian d foy und Tad McClellan) für ihre Bereitschaft bedanken, hinauszugehen und Woche für Woche vor den Kursteilnehmern zu stehen, um mit ihren Notizen zurückzukommen und zu berichten, was funktioniert hat und was nicht, damit wir das Material für dieses Buch feiner abstimmen konnten. Besonders hervorheben möchte ich meinen Mitautor und Geschäftspartner Tom Phoenix dafür, dass er viele Stunden daran gearbeitet hat, den Lama-Kurs zu verbessern und das hervorragende Grundgerüst für den größten Teil dieses Buchs zu erstellen. Danke an brian d foy, der ab der 4. Auflage Hauptautor wurde und mich damit von diesem ewigen To-do-Eintrag in meiner Inbox befreit hat.

Ein Dankeschön auch an alle bei O’Reilly, insbesondere an unsere geduldige Lektorin Allison Randal (mit der ich nicht verwandt bin, aber sie hat natürlich einen wunderbaren Nachnamen), den derzeit verantwortlichen Lektor Simon St. Laurent sowie Tim O’Reilly, der mir überhaupt die Gelegenheit zu dem Kamel- und dem Lama-Buch eröffnet hatte.

Ich stehe außerdem in der Schuld bei den Tausenden von Leuten, die die letzten Auflagen des Lama-Buchs gekauft haben, so dass ich weder unter der Brücke noch im Gefängnis gelandet bin. Außerdem danke ich meinen Kursteilnehmern, die mir beigebracht haben, ein besserer Kursleiter zu sein. Des Weiteren danke ich der erstaunlichen Anzahl von Fortune-1000-Kunden, die unsere Kurse in der Vergangenheit gebucht haben und dies auch in Zukunft tun werden.

Wie immer, ein besonderes Dankeschön an Lyle und Jack dafür, dass sie mir fast alles beigebracht haben, was ich über das Schreiben weiß.

Von Tom

Ich schließe mich Randals Dank an alle bei O’Reilly an. Für die 3. Auflage war Linda Mui unsere Lektorin, und ich bin ihr immer noch dankbar für die Geduld, die sie bewies, während sie uns dazu brachte, die allzu übertriebenen Witze und Fußnoten rauszuwerfen; gleichzeitig muss ich betonen, dass sie keinerlei Schuld für die verbliebenen Albernheiten trifft. Linda und Randal führten mich durch den Schreibprozess, wofür ich ihnen dankbar bin. Später übernahm dann Allison Randal die Aufgabe der Lektorin, und mittlerweile ist es Simon St. Laurent. Diesen beiden gilt mein Dank für ihre ganz besonderen Beiträge.

Außerdem schließe ich mich Randal an, was die anderen Stonehenge-Trainer angeht, aber auch ihn selbst: Sie haben sich so gut wie nie darüber beklagt, wenn ich unerwartet das Kursmaterial verändert habe, um eine neue Lehrmethode auszuprobieren. Ihr habt eine Menge verschiedene Perspektiven hinsichtlich der Lehrmethoden beigetragen, die ich ohne euch nie kennengelernt hätte.

Ich arbeitete viele Jahre am Oregon Museum of Science and Industry (OMSI) und ich möchte euch allen danken, dass ich meine Lehrmethoden verbessern durfte, indem ich lernte, einen oder zwei Witze in jede nur mögliche Tätigkeit einzubauen.

Danke auch an die vielen Leute im Usenet, die ihr mir eure Wertschätzung und Aufmunterungen für meine Beiträge dort gezeigt habt. Wie immer hoffe ich, es hilft.

Auch den vielen Studenten gilt Dank, die mir mit ihren Fragen (und ihren verdatterten Gesichtern) gezeigt haben, wann ich nach einer anderen Möglichkeit suchen musste, ein bestimmtes Konzept zu erklären. Ich hoffe, dass das vorliegende Buch jede noch verbliebene Verwirrung auflöst.

Selbstverständlich gilt meine tiefe Dankbarkeit insbesondere meinem Koautor Randal, der mir die Freiheit gab, verschiedene Arten auszuprobieren, das Material sowohl im Kurs als auch hier im Buch zu präsentieren. Außerdem danke ich ihm für seine Initiative, dieses Material überhaupt als Buch herauszubringen. Ich bin schwer beeindruckt von deinen Anstrengungen sicherzustellen, dass niemand anders in die rechtlichen Schwierigkeiten gerät, die so viel von deiner Zeit und Energie gestohlen haben; du bist ein gutes Vorbild.

Von brian

Ich habe zuerst Randal zu danken, da ich Perl mithilfe der 1. Auflage dieses Buchs erlernte. 1998 musste ich es noch einmal erlernen, als er mich bat, als Lehrer für Stonehenge zu arbeiten. Lehren ist oft der beste Weg, etwas zu lernen. Seit dieser Zeit ist Randal mein Mentor für Perl und viele andere Dinge, von denen er meinte, dass ich sie lernen sollte – zum Beispiel zu der Zeit, als er entschied, dass wir für eine Demonstration auf einer Webkonferenz Smalltalk an Stelle von Perl verwenden sollten. Ich bin immer wieder überrascht über die Vielfalt seines Wissens. Er hat mir Perl beigebracht, und jetzt helfe ich selbst bei dem Buch mit, mit dem ich einst begonnen hatte. Ich fühle mich sehr geehrt, Randal.

Während der ganzen Zeit, als ich für Stonehenge arbeitete, habe ich Tom Phoenix wahrscheinlich insgesamt höchstens zwei Wochen gesehen, aber ich unterrichte schon seit Jahren seine Version des Perl-Einführungskurses. Diese Version stellte die Grundlage für die 3. Auflage dieses Buchs dar. Dadurch, dass ich diesen Kurs unterrichte, habe ich neue Möglichkeiten gefunden, so gut wie alles zu erklären, und sogar noch die eine oder andere Ecke von Perl genauer kennengelernt.

Als ich Randal davon überzeugte, dass meine Mitarbeit bei der Aktualisierung des Lama-Buchs von Vorteil sein würde, wurde mir die Verantwortung für das Proposal an den Verlag, die Gliederung der neuen Auflage und das Managen der Manuskriptversionen übertragen. Unsere Lektorin Allison Randal half mir bei all dem sehr und ertrug meine ständigen E-Mails ohne Klagen. Nach ihrem Aufbruch zu neuen Ufern hat Simon St. Laurent uns als Lektor und Insider bei O’Reilly sehr geholfen und immer die richtige Mondphase abgewartet, um eine weitere Überarbeitung anzuregen.

Von uns allen

Danke unseren Fachkorrektoren David H. Adler, Alan Haggai Alavi, Andy Armstrong, Dave Cross, Chris Devers, Paul Fenwick, Stephen Jenkins, Matthew Musgrove, Jacinta Richardson, Steve Peters, Peter Scott, Wil Wheaton und Karl Williamson für ihre Anmerkungen zu unserem Manuskript.

Danke auch an die vielen Kursteilnehmer, die uns mitgeteilt haben, welche Teile des Kursmaterials über die Jahre verbesserungswürdig waren. Euretwegen sind wir heute so stolz darauf.

Danke auch an die vielen Perl Mongers, die uns ein Zuhause gegeben haben, wenn wir ihre Städte besucht haben. Lasst es uns irgendwann wiederholen.

Und schließlich gilt unser aufrichtigster Dank unserem Freund Larry Wall dafür, dass er die Weisheit besaß, seine wirklich coolen und mächtigen Werkzeuge dem Rest der Welt zugänglich zu machen, damit wir alle unsere Arbeit ein bisschen schneller, leichter und mit mehr Spaß erledigen können.

Kapitel 1. Einleitung

Willkommen zum Lama-Buch!

Dies ist die 6. Auflage eines Buchs, in dessen Genuss seit 1993 über eine halbe Million Leser gekommen sind. Wir hoffen zumindest, dass sie es genossen haben. Uns hat es jedenfalls Spaß gemacht, es zu schreiben.[4]

Fragen und Antworten

Wahrscheinlich haben Sie einige Fragen zu Perl, und vielleicht auch einige zu diesem Buch, besonders wenn Sie schon ein wenig herumgeblättert haben, um zu sehen, was dieses Buch so alles bietet. Wir werden daher dieses Kapitel dazu benutzen, Ihre Fragen zu beantworten bzw. Ihnen zu erzählen, wo Sie Antworten herbekommen, die nicht in diesem Buch stehen.

Ist dies das richtige Buch für Sie?

Wenn Sie und wir uns auch nur ein wenig ähnlich sind, dann stehen Sie vermutlich jetzt in einem Buchladen[5] und fragen sich, ob Sie dieses Lama-Buch kaufen und Perl lernen sollen oder das Buch da drüben, um eine Sprache zu lernen, die nach einer Schlange[6] benannt ist, nach einem Getränk oder einem Buchstaben des Alphabets. Sie haben genau zwei Minuten Zeit, bevor der Verkäufer herüberkommt, um Ihnen zu sagen, dass das hier keine Bibliothek sei,[7] und Sie auffordert, entweder etwas zu kaufen oder den Laden zu verlassen. Vielleicht wollen Sie die zwei Minuten nutzen, um ein kurzes Perl-Programm zu sehen, anhand dessen Sie erkennen können, was Perl so alles kann. In diesem Fall sollten Sie die Perl-Blitztour weiter hinten in diesem Kapitel mitmachen.

Das hier ist kein Nachschlagewerk. Es ist eine Einführung in die Grundlagen von Perl, das Ihnen gerade das Nötigste vermittelt, um einfache Programme für den Hausgebrauch zu schreiben. Wir behandeln nicht alle Details eines jeden Themas, und wir verteilen einige der Themen über mehrere Kapitel, so dass Sie mit bestimmten Konzepten jeweils dort vertraut gemacht werden, wo Sie sie auch brauchen.

Wir schreiben für Leser, die schon das eine oder andere übers Programmieren wissen und jetzt Perl lernen möchten. Wir gehen davon aus, dass Sie sich schon einigermaßen damit auskennen, wie man ein Terminal benutzt, Dateien editiert und Programme laufen lässt – aber eben nicht mit Perl-Programmen. Sie wissen, was Variablen, Subroutinen usw. sind, aber Sie wollen wissen, wie so etwas in Perl funktioniert.

Das heißt nicht, dass Sie als blutiger Anfänger, der noch nie ein Terminal-Programm angesehen oder eine Codezeile geschrieben hat, durchgehend Bahnhof verstehen werden. Sie werden vielleicht nicht alles verstehen, was wir schreiben, wenn Sie das Buch das erste Mal durchgehen, aber eine Menge Anfänger haben dieses Buch schon zum Lernen benutzt, ohne völlig zu verzweifeln. Der Trick besteht darin, sich keine Gedanken um all das zu machen, was man vielleicht nicht versteht, sondern sich stattdessen einfach auf die grundlegenden Konzepte zu konzentrieren, die wir vorstellen. Sie werden vielleicht etwas länger brauchen als ein erfahrener Programmierer, aber irgendwo müssen Sie ja anfangen.

Und: Das hier sollte nicht das einzige Perl-Buch sein, das Sie jemals lesen. Es ist nur eine Einführung und bei Weitem nicht umfassend. Es ist eine erste Starthilfe, um Sie auf den richtigen Weg zu bringen, damit Sie dann, wenn Sie so weit sind, mit unseren anderen Büchern weitermachen können: Intermediate Perl (deutsch: Einführung in Perl-Objekte, Referenzen & Module, zurzeit nur als E-Book erhältlich – bekannt als das »Alpaka-Buch«) und Mastering Perl. Das maßgebliche Nachschlagewerk zu Perl ist Programming Perl, das auch das »Kamel-Buch« genannt wird (deutsch: Programmieren mit Perl; zurzeit nur als E-Book erhältlich).

Wir möchten außerdem anmerken, dass dieses Buch zwar Perl bis Version 5.14 behandelt, aber auch nutzbringend verwendet werden kann, wenn Sie eine frühere Version benutzen. Dann verpassen Sie vielleicht ein paar coole neue Features, aber auf jeden Fall lernen Sie die grundlegende Verwendung von Perl kennen. Die älteste Version, die wir in unsere Überlegungen mit einbeziehen werden, ist Perl 5.8, obwohl es vor fast zehn Jahren veröffentlicht wurde.

Warum gibt es so viele Fußnoten?

Danke, dass Sie das bemerkt haben. Es gibt eine Menge Fußnoten in diesem Buch. Ignorieren Sie sie. Die Fußnoten werden gebraucht, weil Perl eine ganze Reihe von Ausnahmen zu seinen Regeln hat. Das ist eine gute Sache, da das reale Leben auch voller Ausnahmen ist.

Das hat zur Folge, dass wir nicht ohne zu lügen sagen können: »Der fitzbin-Operator frobniziert die husistatische Variable.«, ohne die Ausnahmen[8] in einer Fußnote zu erläutern. Da wir ziemlich ehrliche Leute sind, müssen wir also eine Menge Fußnoten schreiben. Sie dagegen können ehrlich sein, ohne die Fußnoten lesen zu müssen (witzig, wie sich das ergibt). Die Fußnoten bieten zusätzliche Informationen, die Sie für die Grundkonzepte nicht benötigen.

Viele der Ausnahmen haben mit der Portierbarkeit des Codes zu tun. Die Geschichte von Perl begann auf Unix-Systemen und ist dort auch heute noch ziemlich tief verwurzelt. Wo immer es möglich war, haben wir versucht, auf unerwartetes Verhalten hinzuweisen, egal ob es daher rührt, dass ein Programm auf einem Nicht-Unix-System laufen soll, oder auf einem anderen Grund beruht. Wir hoffen, dass dieses Buch auch für unsere Leser, die nichts über Unix wissen, eine gute Einführung in Perl darstellt. (Und die werden nebenbei noch etwas über Unix lernen – ohne Extrakosten, versteht sich.)

Außerdem folgen die meisten Ausnahmen der alten »80/20«-Regel, die besagt, dass 80% des Verhaltens von Perl in 20% der Dokumentation beschrieben werden kann. Die übrigen 20% des Verhaltens nehmen dafür die verbleibenden 80% der Dokumentation ein. Um dieses Buch also übersichtlich zu halten, besprechen wir im Haupttext die gängigsten und leicht erklärbaren Anwendungsformen. In den Fußnoten (die außerdem eine kleinere Schrift verwenden, so dass wir bei gleichem Platzverbrauch mehr sagen können)[9] gehen wir dann auf die anderen Dinge ein. Wenn Sie das Buch zum ersten Mal ganz durchgelesen haben, ohne dabei die Fußnoten mitzulesen, werden Sie sich vermutlich einige Abschnitte zur Vertiefung noch einmal ansehen wollen. Wenn Sie an diesem Punkt angekommen sind oder die Neugier beim Lesen einfach zu groß wird, können Sie die Fußnoten lesen. Ein Großteil sind sowieso nur Informatikerwitze.

Was ist mit den Übungen und ihren Lösungen?

Die Übungen finden Sie jeweils am Ende jedes Kapitels. Sie basieren auf den Erfahrungen, die wir mit diesem Kursmaterial bereits vor tausenden[10] von Kursteilnehmern gemacht haben. Wir haben diese Übungen sorgfältig zusammengestellt, um Ihnen die Gelegenheit zu geben, auch einmal Fehler zu machen.

Nicht dass wir wollen, dass Sie Fehler machen, aber Sie brauchen die Gelegenheit dazu. Die meisten dieser Fehler werden Ihnen während Ihrer Perl-Karriere begegnen, warum also nicht gleich jetzt? Jeden Fehler, den Sie beim Lesen dieses Buchs begehen, machen Sie nicht noch einmal, wenn Sie unter Zeitdruck ein Programm schreiben müssen. Außerdem sind wir, falls einmal etwas schiefgehen sollte, die ganze Zeit bei Ihnen. Anhang A, enthält unsere Lösungen für jede Übung und bespricht die Fehler, die Sie gemacht haben, sowie ein paar Fehler, die Sie nicht gemacht haben. Sehen Sie sich diese Lösungen und Erläuterungen an, wenn Sie die Übungen erledigt haben.

Aber schlagen Sie die Antwort nicht nach, bevor Sie nicht ernsthaft versucht haben, selbst auf die Lösung zu kommen. Ihr Lernerfolg wird besser sein, wenn Sie die Lösung von sich aus finden, als wenn Sie sie einfach nachlesen. Schlagen Sie Ihren Kopf nicht gegen die Wand, wenn Sie mal eine Aufgabe nicht lösen können. Ärgern Sie sich nicht und machen Sie einfach mit dem nächsten Kapitel weiter.

Selbst wenn Sie überhaupt keine Fehler machen, sollten Sie sich die Antworten ansehen, wenn Sie mit der Übung fertig sind. Der Begleittext zeigt einige Details der Übungsprogramme auf, die auf den ersten Blick vielleicht nicht ganz so offensichtlich sind.

Wenn Sie gern zusätzliche Übungen machen möchten, probieren Sie es mit dem englischsprachigen Learning Perl Student Workbook, in dem zu jedem der Kapitel mehrere weitere Übungen angefügt sind.

Was bedeuten die Zahlen am Anfang der Übungen?

Jeder Übung ist vor dem Text eine Zahl in eckigen Klammern vorangestellt:

  1. [2] Was bedeutet die Zahl 2, die am Anfang einer Übung steht?

Diese Zahl ist unsere (grobe) Schätzung, wie viele Minuten Sie in etwa für das Absolvieren einer Übung brauchen werden. Seien Sie bitte nicht überrascht, wenn Sie (inklusive des Schreibens, Testens und Debuggens) nur die halbe Zeit benötigen oder auch nach mehr als der doppelten Zeit noch nicht fertig sind. Wenn Sie allerdings wirklich nicht weiterkommen, werden wir natürlich nicht verraten, dass Sie in Anhang A nachgesehen haben, wie die Antwort lautet.

Wie soll ich als Perl-Dozent vorgehen?

Wenn Sie Perl-Kurse leiten und sich entschieden haben, dieses Buch im Kurs einzusetzen (wie es schon viele andere getan haben), sollten Sie wissen, dass wir jeden Übungsblock so konzipiert haben, dass die meisten Schüler in 45 bis 60 Minuten damit fertig sind und noch etwas Zeit für eine Pause bleibt. Die Übungen einiger Kapitel brauchen weniger Zeit, andere dauern womöglich etwas länger. Nachdem wir den Übungen diese kleinen Zahlen in den eckigen Klammern vorangestellt hatten, wussten wir plötzlich einfach nicht mehr, wie wir sie zusammenzählen sollten. (Glücklicherweise wissen wir, wie wir das von Computern erledigen lassen können.)

Es gibt von uns ein begleitendes englischsprachiges Buch, das Learning Perl Student Workbook, in dem Sie zu jedem der Kapitel zusätzliche Übungen finden. Wenn Sie sich das Workbook zur vierten Auflage besorgen, müssen Sie für sich die Kapitelreihenfolge ändern, weil wir in der vorliegenden Auflage ein Kapitel hinzugefügt und ein anderes verschoben haben.



[4] Um sicherzugehen: Die 1. Auflage wurde von Randal L. Schwartz geschrieben, die 2. von Randal und Tom Christiansen, die 3. Auflage von Randal und Tom Phoenix und die letzten drei von Randal, Tom Phoenix und brian d foy. Wenn wir also »wir« sagen, meinen wir die letzte Gruppe. Wenn Sie sich nun fragen, warum es uns Spaß gemacht hat (in der Vergangenheitsform), dieses Buch zu schreiben, obwohl wir uns noch auf der ersten Seite befinden, ist die Antwort leicht: Wir haben hinten angefangen und uns dann nach vorne vorgearbeitet. Das mag jetzt zwar etwas seltsam klingen, aber um ehrlich zu sein, war der Rest einfach, als der Index erst einmal fertig war.

[5] Wenn Sie und wir uns tatsächlich ähnlich sind, stehen Sie jetzt eher in einer Bücherei und nicht in einem Buchladen. Aber wir wollen ja nicht kleinlich sein.

[6] Bevor Sie uns jetzt schreiben, um uns mitzuteilen, dass es sich eigentlich um eine Comedy-Truppe handelt, sollten wir Ihnen vielleicht erklären, dass wir – mit einem Buchstabendreher – eigentlich CORBA meinen.

[7] Es sei denn, es ist wirklich eine.

[8] Außer dienstags während eines Stromausfalls, wenn Sie bei Tag-und-Nacht-Gleiche Ihren Ellenbogen verdrehen oder wenn bei einer Perl-Version vor 5.12 use integer innerhalb eines von einer Prototyp-Subroutine aufgerufenen Schleifenblocks benutzt wird.

[9] Wir haben uns sogar überlegt, das ganze Buch als Fußnote zu konzipieren, um die Seitenzahl klein zu halten. Wir haben diese Idee jedoch wieder verworfen, weil uns Fußnoten mit Fußnoten dann doch ein bisschen zu verrückt vorkamen.

[10] Natürlich nicht gleichzeitig.