Perl [freie, plattformunabhängige und interpretierte Programmiersprache, die mehrere Paradigmen erlaubt.
] ist einePerl | |
---|---|
![]() | |
Basisdaten | |
Erscheinungsjahr: | 1987 |
Designer: | Larry Wall |
Entwickler: | Larry Wall, Perl Porter |
Aktuelle Version: | 5.8.8 (31. Januar 2006) |
Typisierung: | schwach, dynamisch, implizit |
Beeinflusst von: | Awk, BASIC-PLUS, C, C++, LISP, Pascal, Python, Sed, Unix-Shell |
Beeinflusste: | PHP, Ruby, Python. JavaScript |
Betriebssystem: | plattformunabhängig |
Lizenz: | GPL und Artistic License |
www.perl.org |
Der Linguist Larry Wall entwarf sie 1987 als Synthese aus C, den UNIX-Befehlen und anderen Einflüssen. Ursprünglich als Werkzeug zur System- und Netzwerkadministration vorgesehen, hat Perl auch bei der Entwicklung von Webanwendungen und in der Bioinformatik weite Verbreitung gefunden. Hauptziele sind eine schnelle Problemlösung und größtmögliche Freiheit für Programmierer. Die Bearbeitung von Texten mit Hilfe regulärer Ausdrücke und viele frei verfügbare Module im CPAN sind Stärken der Sprache.
Etymologie / Wortherkunft
Der Name Perl bezieht sich auf ein Zitat aus dem Matthäus-Evangelium [13,46], in dem Jesus das Himmelreich mit dem Bild eines Händlers beschreibt, der seinen gesamten Besitz verkaufen will, um eine kostbare Perle zu erwerben. Noch vor der Veröffentlichung wurde der Name von „Pearl“ in „Perl“ geändert, da es bereits eine Programmiersprache namens PEARL gab. Allgemein verbreitet und von Larry Wall akzeptiert sind auch die Backronyme Practical Extraction and Report Language (zweckmäßige Extraktions- und Berichtssprache) und Pathologically Eclectic Rubbish Lister (krankhaft vielseitiger Blödsinnsauflister). Die Schreibweise „Perl“ bezeichnet die Sprache, „perl“ dagegen das Programm, das diese Sprache interpretiert. Ferner legt die Perl-Gemeinde Wert darauf, dass nicht die Schreibweise „PERL“ verwendet wird.[1]
Geschichte
Entstehung
Larry Wall war als Administrator und Programmierer bei dem Unternehmen Unisys angestellt, bei dem er seit März 1987 daran beteiligt war unter dem Namen blacker ein sicheres Netzwerk für die NSA zu entwickeln. Er erhielt mehrere Aufträge, Werkzeuge zur Fernwartung und Überwachung der entstehenden Software zu schaffen. Eine Hauptaufgabe war dabei, übersichtliche Berichte aus verstreuten Logdateien zu erzeugen. Da die vorhandenen Sprachen und Werkzeuge ihm dafür zu umständlich erschienen, entwickelte er mit Hilfe seines damaligen Teamkollegen Daniel Faigin und seines Schwagers Mark Biggar schrittweise eine eigene Sprache, um seine Aufgaben zu lösen.
Dabei griff er auch auf sein Wissen und seine Erfahrung als Linguist zurück und entwarf Perl nah an den menschlichen Sprachgewohnheiten. Dies drückt sich in minimalen Voraussetzungen für Einsteiger, einer starken Kombinierbarkeit der Sprachelemente und einem reichen Wortschatz aus, der auch Befehle zulässt, deren Bedeutungen sich überschneiden. Wall sieht darin die Bedürfnisse eines Praktikers nach Freiheit und intuitivem Ausdruck verwirklicht.
Gemäß diesem praktischen Ansatz borgte sich Perl seinen Wortschatz und seine logischen Strukturen von den in den 1980er Jahren unter Unix verbreiteten Sprachen und Werkzeugen, was das Erlernen vereinfachte, aber auch die Unix-Philosophie umkehrte.
Unix und seine Systembefehle waren kompiliert und meist in C geschrieben. Diese Befehle waren logische Einheiten und sollten genau eine Aufgabe beherrschen („Do one thing and do it well“/„Mach eine Sache und mach sie gut“). Interpretierte Shell-Skripte kombinierten schnell und einfach die Befehle, die untereinander ihre Ergebnisse durch Pipes weiterreichen konnten. Perl verletzt diese Philosophie, indem es diese Befehle zum Bestandteil der Programmiersprache macht, also C und Shell vereint und die vorhandenen Befehle und Werkzeuge übergeht.
Dies wurde notwendig, weil Shell-Skripte für komplexe Aufgaben ungeeignet waren. Ihr Ablauf ist sehr einfach, sie können Daten nur eingeschränkt zwischenspeichern und die Pipes sind Nadelöhre für den Datenaustausch. Andererseits erlauben sie einen wesentlich kompakteren Programmierstil, da ein benutzes UNIX-Werkzeug viele Zeilen C-Quelltext ersetzen kann.
Um die Vorteile beider Programmierarten nutzen zu können, schuf Wall eine Kombination aus C und Werkzeugen wie sed, awk, grep und sort. Dazu fügte er Eigenschaften der Bourne Shell, in geringem Maße auch Elemente aus Pascal und BASIC, sowie eigene Ideen [2]. Diese Fusion ermöglichte kurze, mächtige Programme, die man schnell schreiben und jederzeit auch testen konnte, ohne sie kompilieren zu müssen, was die Entwicklung ebenfalls beschleunigte. Später wurden weitere Fähigkeiten von Sprachen wie LISP, Smalltalk, Python oder Ruby „importiert“.
Perl 1–4
Am 18. Dezember 1987 publizierte Larry Wall sein Programm im Usenet als Perl 1.0, das damals noch, wie der Name sagt, eine mächtigerere Shell war, die gut mit Texten und Dateien umgehen, andere Programme steuern und gut lesbare Berichte ausgeben konnte.
Bereits am 5. Juni im Jahr darauf erschien die Version 2.0 mit grunderneuerter und erweiterter Regex-Engine und einigen weiteren Verbesserungen.
Am 18. Oktober 1989 folgte Perl 3, das mit binären Daten umgehen konnte und auch Netzwerkprogrammierung ermöglichte. Als neue Lizenz wurde die GPL gewählt.
Fast unverändert war es ab dem 21. März 1991 als Perl 4 erhältlich, jedoch nun wahlweise unter der GPL oder der von Larry entwickelten Artistic License. Der eigentliche Grund für die neue Version war aber das gleichzeitig erschienene Kamelbuch, das als Referenz für den aktuellen, als Version 4 markierten Stand, veröffentlicht wurde. Bis dahin waren die seit Perl 1 verfügbaren UNIX-man-pages die einzige verfügbare Perl-Dokumentation. Diese bieten zu jedem Thema eine fundierte und umfangreiche Abhandlung, aber keinen einfachen Einstieg für Perl-Anfänger.
Diese Lücke sollte das von Randal L. Schwartz, Larry Wall und Tom Christiansen verfasste Buch schließen. Es erschien im O’Reilly Verlag, der mit diesem und weiteren Titeln als renommierter Fachverlag für Programmierer bekannt wurde. Perl-Bücher von O’Reilly wurden die maßgeblichen Perl-Publikationen, was sich erst im neuen Jahrtausend etwas relativierte. Der Verlag betreibt auch unter der Internetadresse perl.com das meistbesuchte Online-Magazin für Perl-Programmierung und veranstaltet mit der TPC (The Perl Conference – heute OSCON) die größte Perl-Konferenz. O’Reilly profitierte von Perls wachsender Popularität, und im Gegenzug bezahlte Tim O’Reilly seinem Freund Larry Wall in den folgenden Jahren ein festes Gehalt, der sich so, ohne weitere Pflichten oder Vorgaben, der Weiterentwicklung der Sprache widmen konnte.
1993 als Perl die Version 4.036 erreichte, brach Larry Wall die Weiterentwicklung ab, um mit Perl 5 eine vollständige Neuentwicklung zu beginnen.
Perl 5
Diese wurde am 18. Oktober 1994 vollendet und war der bisher größte Schritt für die Sprache. Mit Plain Old Documentation konnte man nun formatierte Dokumentation in den Quelltext einfügen. Auch ließ sich die Sprache ab jetzt durch separate Module erweitern, was im folgenden Jahr zur Entstehung des CPAN führte. Dieses große Archiv frei erhältlicher Module ist heute selbst ein wichtiger Grund, Perl einzusetzen. Eine weitere wichtige Neuerung, war die Einführung von Referenzen die erstmals eine einfache Erstellung zusammengesetzter Datenstrukturen erlaubte.
Mit Version 5 wurde es auch möglich, objektorientiert in Perl zu programmieren. Dabei wählte Larry Wall einen ungewöhnlichen Weg und leitete die dafür verwendete Syntax fast ausschließlich aus vorhandenen Sprachelementen ab (Packages, Package-Funktionen und Package-Variablen sowie den neuen Referenzen). Lediglich die Funktion bless()
zum Anlegen eines Objektes und der Pfeil-Operator (->
) zum Aufruf von Methoden kamen hinzu. Es entstand auch XS, eine Sammlung von C-Makros, die es ermöglicht, Perl-Programme mit anderen Sprachen zu erweitern oder mit Perl-Programmen beliebige Software oder Hardware anzusprechen.
Seit der Veröffentlichung von Perl 5 beteiligte sich Larry Wall kaum noch an der Entwicklung der Sprache. Dies übernahmen freiwillig Perl-begeisterte Programmierer, die sogenannten Perl 5 Porter, die über die im Mai 1994 gegründete p5p-Mailingliste kommunizieren, aber auch zunehmend über einen eigenen Bug- und Request-Tracker (RT) über Fehlerbehebungen und neue Funktionen der Sprache entscheiden. Dabei übernimmt je Version ein sogenannter Pumpking die Leitung. Der Begriff Perl Porter entstammt der ursprünglichen Aufgabe der p5p-Liste, die Portierung von Perl auf andere Betriebssysteme zu koordinieren.
Aktuelle Versionen
Die aktuelle Weiterentwicklung findet in den von Rafaël Garcia-Suarez geleiteten Entwicklerversionen 5.9.x statt. Für den täglichen Gebrauch werden derzeit die Versionsreihen 5.6.x und 5.8.x gepflegt. Die aktuelle, von Nicholas Clark betreute Version 5.8.8 ist weitestgehend befreit von den Problemen mit Unicode und Threads, das von Gurusamy Sarathy geleitete 5.6.2 ist wegen kleiner Inkompatibilitäten aber immer noch eine Alternative. 5.004 und 5.005 sind veraltet, wichtige Module funktionieren mit ihnen aber weiterhin, wobei 5.005 noch minimal weitergepflegt wird. Die nächste Benutzerversion 5.10.0 wird von Hugo van der Sanden vorbereitet.
Perl 6
Am 18. Juli 2000 auf der TPC 4 [3] wurde Perl 6 als die Version der Perl-Gemeinschaft angekündigt. Nachdem Larry Wall mehrere hundert Vorschläge auswertete und thematisch sortierte, schrieb er je Thema einen Überblick seiner Vorstellungen (Apocalypse genannt), der nach Diskussionen in den Mailinglisten von Damian Conway zu einer detaillierten Exegese formuliert wird. Dabei wird die Sprache entrümpelt und mit neuen Fähigkeiten ausgestattet[4]. Unter anderem wurde die Objektorientierung komplett neu gestaltet und funktionale Programmierelemente wie Hyperoperatoren, Junctions eingeführt. Macros werden Sourcefilter ablösen und die neu systematisierten und erweiterten Regulären Ausdrücke werden nun rules genannt da sie sich zu ableitbaren Grammatiken zusammenfassen lassen, was eine lex-ähnliche Programmierweise erlaubt. Sie werden mit dem smart match-Operator ~~ angewendet der je nach Kontext verschiede Arten von Daten, Datenstrukturen und auch Inhalte von Symboltabellen vergleichen kann.
Diese Neugestaltung der Syntax ist in großen Teilen abgeschlossen, Bereiche wie Threads wurden aber noch gar nicht abgedeckt. Da im Gegensatz zu den ersten Jahren die Weiterentwicklung meist in den Mailinglisten und kleineren Kreisen geschieht, sind die Apocalypsen und Exegesen teilweise veraltet und wurden durch wesentlich knapper gehaltene Synopsen ersetzt.
Als Interpreter für Perl 6 ist eine neue registerbasierte Virtuelle Maschine namens Parrot in Entwicklung, die neben Perl 6 noch viele andere Sprachen kompilieren (in Bytecode übersetzen) und ausführen können soll. Sie wurde von Chip Salzenberg und Dan Sugalski entworfen und wird derzeit von Salzenberg und Leopold Tötsch betreut.
Nach der Freigabe von Perl 6 und Parrot soll Perl 5 aber noch lange gewartet werden. Ein erster Versuch dies sicherzustellen war der von Juli 2003 bis Ende 2005 von Arthur Bergman entwickelte Parrot-Parser namens Ponie, der immer vollständig kompatibel zur jeweils aktuellen Perl5 Version sein sollte. Auch hat es sich Larry Wall zur Aufgabe gemacht, ein Programm zu schreiben, das Perl 5 in Perl 6 übersetzen kann. Dieses ist seit Anfang 2006 in Entwicklung und wird derzeit MAD genannt.
Audrey Tang leitet seit Anfang Februar 2005 die Entwicklung des alternativen Perl-6-Compilers namens Pugs in der Sprache Haskell. Die Entwicklung geht wesentlich schneller als beim Parrot-Projekt voran, und bereits seit Anfang 2006 können damit Programme ausgeführt werden, die sowohl große Teile der Perl-6-Syntax als auch Perl-5-Module benutzen können. Pugs erfüllt bereits wichtige Aufgaben bei der Erprobung der neuen Syntax, dem Schreiben der Spezifikationen, Dokumentation, Beispielen und Softwaretests für Perl 6. Es wurde bereits begonnen, Teile von Pugs nach Perl 6 zu übertragen, um eher den geplanten Perl-6-Parser für Parrot zu erhalten, der in Perl 6 geschrieben sein soll.
Merkmale
Prinzipien
Perl wurde für den praktischen Einsatz entwickelt und konzentriert sich daher auf einfache Programmierbarkeit, Vollständigkeit, Effizienz und Anpassbarkeit. Diese Philosophie drückt sich in den folgenden Schlagworten oder Phrasen aus, die meist von Larry Wall stammen.
Mehrere Wege
Das bekannteste und grundlegendste Perl-Motto ist „There is more than one way to do it“, kurz TIMTOWTDI oder (mit englischer Kontraktion) TMTOWTDI, gesprochen „Tim Toady“. Zu deutsch: „Es gibt mehr als einen Weg, etwas zu tun“. Perl macht im Gegensatz zu Sprachen wie Python weniger Vorgaben und bietet absichtlich für jedes Problem mehrere Formulierungs- und Lösungsmöglichkeiten (Syntaktischer Zucker). Zum Beispiel kann man logische Operatoren als ||
und &&
(wie in C) oder (mit Bedeutungsnuancen) als or
und and
(wie in Pascal) schreiben; aber auch zahlreiche Befehle mit einem sich überschneidenden Funktionsumfang wie map
und for
erlauben verschiedene Formulierungen für den gleichen Sachverhalt. Einige Befehle wie der Diamant-Operator (<>
) bieten verkürzte Schreibweisen für bereits vorhandene Funktionalität.
Dass Vielfalt eine erklärte Tugend der Perl-Kultur ist, wird auch im CPAN sichtbar, wo oft mehrere Module einen sehr ähnlichen Zweck erfüllen. Dies alles erlaubt dem Programmierer nicht nur das Schreiben maßgeschneiderter Software, sondern bietet auch die Freiheit, persönlichen Vorlieben nachzugehen, was für manche ein wichtiger Grund ist, sich für Perl zu entscheiden.
Ein weiteres Schlagwort, das man auch als Erweiterung von TIMTOWTDI sehen kann, bezeichnet Perl als die erste postmoderne Programmiersprache. Damit ist gemeint, dass Perl verschiedene Paradigmen vereint und es dem Benutzer frei steht, strukturierte, objektorientierte, funktionale und imperative Sprachmerkmale zu kombinieren.
Einfach und möglich
Der andere wichtige Merksatz ist Perl makes easy jobs easy and hard jobs possible., was zu deutsch bedeutet Perl hält die einfachen Aufgaben einfach und macht (die Lösung) schwierige(r) Aufgaben möglich. Dies beinhaltet zum ersten das Ziel, gängige Aufgaben möglichst mit kurzen „fertigen Lösungen“ zu vereinfachen. Zum Beispiel prüft -e dateiname
die Existenz einer Datei. Einfache Aufgaben einfach zu belassen beinhaltet für Perl aber auch, möglichst keine vorbereitenden Programmieranweisungen zu verlangen. Zweitens versucht Perl vollständig zu sein und für jedes Problem mindestens die Grundlagen bereitzustellen, die eine Lösung möglich machen. Das dritte Ziel, die beiden ersten Ziele nicht kollidieren zu lassen, gewinnt mit dem wachsendem Sprachumfang von Perl 6 immer mehr an Bedeutung, wo in Anlehnung an den Huffman-Code die Schreibweisen der am häufigsten verwendeten Befehle möglichst kurz gehalten sind, ohne mit der Logik der Schreibweise ähnlicher Befehle zu brechen.
Kontextsensitiv
In Perl gibt es Befehle, die verschiedene Bedeutungen haben, je nachdem, in welchem Zusammenhang sie benutzt werden. Derart kontextsensitiv sind Datenstrukturen wie das Array. Wird es einem anderen Array zugewiesen, wird dessen Inhalt übergeben; ist der Empfänger ein einzelner Wert (Skalar), erhält dieser die Länge des Arrays.
Technische Merkmale
Der Perl-Interpreter selbst ist ein in C geschriebenes Programm, das auf annähernd jedem Betriebssystem kompilierbar ist, vorkompilierte Versionen auf selten verwendeten Systemen wie zum Beispiel BeOS oder OS/2 sind jedoch nicht immer auf dem neuesten Stand. Der Quellcode umfasst circa 50 MB und enthält auch Perl-Skripte, die die Funktion von Makefiles, und der Test-Suite übernehmen. Aktuell ist das kompilierte Programm circa 850 KB groß, was aber je nach Betriebssystem, verwendetem Compiler und Bibliotheken variieren kann.
Perl-Skripte werden in Textdateien mit beliebigem Zeilentrennzeichen gespeichert. Beim Start eines Skripts wird es vom Perl-Interpreter eingelesen, in einen Parse Tree umgewandelt, dieser zu Bytecode, welcher dann ausgeführt wird. Der im Interpreter integrierte Parser ist eine angepasste Version von GNU Bison.
Verbreitung
Zu Beginn war Perl ein UNIX-Werkzeug, das besonders auf die Verarbeitung von Textdateien, Steuerung anderer Programme sowie zur Ausgabe von Berichten ausgelegt war. Dafür wird es bis heute, nicht nur von Systemadministratoren, auf allen verbreiteten Betriebssystemen eingesetzt. Dabei bekam Perl auch den Ruf einer glue language, weil relativ schnell geschriebene Perl-Skripte inkompatible Software verbinden können.
Mit der Verbreitung des World Wide Web wurde Perl zunehmend benutzt, um Webserver, Datenbanken und weitere Programme und Daten zu verbinden und die Ergebnisse in Form von HTML-Seiten auszugeben. Der Perl-Interpreter wird dabei über CGI oder FastCGI vom Webserver angesprochen oder ist direkt im Server eingebettet. (mod_perl im Apache, ActiveState PerlEx im MS IIS). Auch wenn für diese serverseitige Skript-Programmierung PHP mittlerweile populärer wurde, wird Perl weiterhin von vielen großen und kleinen Seiten und Internetdiensten wie Amazon.com, IMDB.com, slashdot.org, MovableType und LiveJournal verwendet. Da Perl-Skripte oft kaum erkennbar an vielen wichtigen Stellen arbeiten, wurde Perl auch scherzhaft als das Klebeband bezeichnet, welches das Internet zusammenhält. In Perl entstanden auch Frameworks wie Mason, Embperl, Maypole, Catalyst und Jifty die eine sehr schnelle Entwicklung komplexer und leicht veränderbarer Internetseiten erlauben. Auch Wiki-Software ist häufig in Perl geschrieben wie z.B. Socialtext das auf Mason basiert, Kwiki, TWiki, ProWiki oder UseMod, daß die Wikipedia in ihren ersten Jahren verwendete. Wichtige Perl-Programme im E-Mail Bereich sind SpamAssassin (Spam-Filter), PopFile und open webmail. Auch verbreitete Ticket Systeme mit Webinterface wie Bugzilla oder RT sind in Perl geschrieben.
Weitere Hauptanwendungsfelder sind das Data-Munging und die Bioinformatik, wo Perl seit etwa 1995 die am häufigsten verwendete Sprache war und immer noch bedeutend ist. Gründe hierfür sind wieder die Fähigkeit, Informationen in Textform zu verarbeiten, und die Flexibilität und Offenheit der Sprache, die es der internationalen Forschergemeinde erlauben, trotz unterschiedlicher Standards der Institute zusammenzuarbeiten. BioPerl ist hier die wichtigste Sammlung frei erhältlicher Werkzeuge, die sich vor allem auf das Gebiet der Genomsequenzenanalyse konzentriert. Beim Human Genome Project spielte Perl eine wichtige Rolle.
Auch Desktop-Anwendungen und Spiele wie Frozen Bubble können sinnvollerweise in Perl geschrieben werden, weil die Personal Computer mittlerweile schnell genug sind, solche Anwendungen auszuführen, und diese schneller entwickelt sind als mit Hilfe kompilierter Sprachen.
Bereiche, in denen Skriptsprachen wie Perl nicht eingesetzt werden können, sind Anwendungen mit hoher Anforderung an Hardware-Nähe und Geschwindigkeit wie zum Beispiel Treiber oder Codecs.
Logos
Als Maskottchen von Perl dient ein Dromedar. Es zierte erstmals den Umschlag des auch als Kamel-Buch bekannten Referenzwerkes Programming Perl,. Sein Verleger (Tim O’Reilly) sagte in einem Interview scherzhaft als Begründung: Perl ist hässlich und kommt über lange Strecken ohne Wasser aus. Das Dromedar ist auf dem Programming Republic of Perl Emblem zu sehen, das oft als offizielles Perl-Logo angesehen wird und dessen nichtkommerziellen Gebrauch O’Reilly gestattet. Andere im Zusammenhang mit Perl benutzte Logos sind neben Perlen die aufgeschnittene Zwiebel (Erkennungszeichen der Perl Foundation) und der Komodowaran, der die weit verbreitete Perl-Distribution von Active State schmückt.
Kritik
Häufigster Kritikpunkt an Perl betrifft seine Lesbarkeit. Kritiker nennen Perl auch eine „write-only“-Sprache, behaupten also, daß der Quelltext selbst für den Autor nach einiger Zeit nicht mehr verständlich ist. Tatsächlich bietet Perl überdurchschnittlich viele Möglichkeiten unleserlichen Code zu produzieren aber es liegt letztlich am Willen und den Fähigkeiten des Programmierers, Les- und Wartbarkeit zu erreichen. Denn andererseits ermöglicht die gleiche Freiheit es auch, besonders nah am Problem oder am menschlichen Verständnis zu programmieren, was zu einer sonst unerreichbaren Lesbarkeit führen kann.
Einige Teile der Syntax wie die Objektorientierung und Signaturen sind zwar einfach und sehr mächtig, werden aber häufig gegenüber vergleichbaren Sprachen wie Python oder Ruby als veraltet wahrgenommen und fordern bei standartisierten Herangehensweisen, besonders von Perl-Anfängern, zusätzliche Tipp- und Denkarbeit. Diese Probleme werden mit Perl6 behoben oder können bereit mit zusätzlichen, für Perl5 erhältlichen Modulen, umgangen werden.
Weiterhin wird Perl vorgeworfen, dass es die UNIX-Philosophie verletzt (siehe dazu den Abschnitt Entstehung).
Starke Kritik wird auch gegen Perl 6 erhoben, daß zu hoch gesteckte Ziele habe und nach 7 Jahren angeblich immer noch keine sichtbaren Ergebnisse brachte und statt dessen die Zukunft von Perl (5) lähme. Perl 6 war von Anfang an als Langzeitprojekt ausgerufen, das ausschließlich auf nicht immer planbarer Freiwilligenabeit und kaum auf finanzieller Unterstützung beruht. Seine konkreten Ziele zeichneten sich erst im Verlauf der Entwicklung ab und es gab eindeutig Probleme in der Kommunikation und der Außendarstellung. Allerdings lautet die nächste Perl-Version 5.10 (noch 5.9.4) und enthält vielsprechende Neurungen aus Perl 6. Perl 6-Projekte wie Pugs oder Parrot sind im stetigen Aufbau und der Perl 6-rules-Compiler PGE beeindruckte auf Fachkonferenzen als Werkzeug für den Parserbau.
Syntax
Freies Format
Perl erlaubt bedingt formatfreien Quellcode. Das bedeutet, dass Einrückungen und zusätzliche Leerzeichen syntaktisch unerheblich sind und auch Zeilenumbrüche nach Belieben eingefügt werden können. Dafür müssen Befehle eines Blocks mit Semikolon getrennt werden. Öffnende geschweifte Klammern und here-docs sind nicht formatfrei.
Variablen
Charakteristisch für Perl ist, dass Variablen durch ein Prefix (auch Sigil genannt) gekennzeichnet werden, das ihren Datentyp anzeigt. Hier einige Beispiele:
- $
- für Skalare: $scalar
- @
- für Arrays: @array
- %
- für Hashes/assoziative Arrays: %hash
- &
- für Funktionen (oft optional): &function
- *
- für Typeglobs: *all
Datei-Handles, Verzeichnis-Handles und Formate besitzen keinen Präfix, sind aber ebenfalls eigenständige Datentypen. Jeder Datentyp hat in Perl seinen eigenen Namensraum.
Basisdatentypen in Perl sind skalare Variablen, Arrays und Hashes (assoziative Arrays).
- Skalare sind typlose Variablen für einzelne Werte, es können Strings, Zahlen oder Referenzen auf andere Daten oder Funktionen in ihnen gespeichert sein.
- Arrays fassen mehrere Skalare unter einem Variablennamen zusammen. Arrayeinträge haben einen Index. Die Zählung beginnt bei der Spezialvariable $[, welche standardmäßig auf 0 steht.
- Hashes fassen ebenfalls Skalare zusammen, allerdings werden hier Einzelwerte (Values) nicht über numerische Indizes, sondern mit Hilfe zugehöriger Keys (Schlüssel) eindeutig identifiziert und angesprochen. Als Schlüssel kann man eine beliebige Zeichenkette benutzen, oder auch alles, was sich in eine Zeichenkette umwandeln lässt.
Hashes und Arrays lassen sich einander zuweisen, wobei Hashes als Listen von Key/Value-Paaren betrachtet werden. Daten verschiedenen Typs lassen sich mittels Referenzen beliebig zu neuen Datenstrukturen kombinieren, beispielsweise sind Hashes denkbar, die neben (Zeigern auf) Arrays auch einzelne Skalare enthalten.
Package-Variablen werden automatisch erstellt, sobald sie das erste Mal verwendet werden. Weitaus häufiger im modernen Sprachgebrauch kommen gültigkeitsbeschränkte Variablen zum Einsatz. Diese müssen mittels my
deklariert werden. undef variable
gibt die angegebene Variable wieder frei.
Kontrollstrukturen
Die grundlegenden Kontrollstrukturen unterscheiden sich kaum von denen in C, Java und JavaScript.
Bedingte Ausführung
if
funktioniert wie aus C bekannt; unless
, eine Besonderheit von Perl, ist eine Schreibweise für if (!(<Bedingung>))
. Eine Case- oder Switch-Anweisung gibt es in Perl 5 nicht, aber diese Struktur lässt sich mit if … elsif … else
nachbilden. Die optimierten logischen Operatoren erlauben auch eine bedingte Ausführung. Bei or
(bzw. ||
) wird der zweite Ausdruck ausgeführt, wenn das Ergebnis des ersten kein wahrer Wert ist, and
(bzw. &&
) funktioniert analog.
if (<Bedingung>) {<Anweisungen>} [elsif (<Bedingung>) {<Anweisungen>}] [else {<Anweisungen>}] unless (<Bedingung>) {<Anweisungen>} [else {<Anweisungen>}] <Bedingung> ? <Anweisung 1> : <Anweisung 2>; <Ausdruck 1> || <Ausdruck 2>; <Ausdruck 1> && <Ausdruck 2>;
Schleifen
Wie in C iterieren while
und for
(in der an C angelehnten Variante), solange die Bedingung wahr ist, until
, bis sie wahr ist, und foreach
iteriert über eine Liste. In Perl 5 sind for
und foreach
austauschbar.
[label:] while (<Bedingung>) {<Anweisungen>} [continue {<Anweisungen>}] [label:] until (<Bedingung>) {<Anweisungen>} [continue {<Anweisungen>}] [label:] for ([<Startanweisung>]; [<Bedingung>]; [<Updateanweisung>]) {<Anweisungen>} [continue {<Anweisungen>}] [label:] for[each] [[my] $element] (<Liste>) {<Anweisungen>} [continue {<Anweisungen>}]
last
verlässt sofort die Schleife, redo
wiederholt die derzeitige Iteration, und next
springt zum continue
-Block, bevor es dann mit der nächsten Iteration fortfährt. Diese Befehle können von einem Label-Bezeichner gefolgt sein, der bei geschachtelten Strukturen bestimmt, auf welche Schleife sich der Befehl bezieht.
do {<Anweisungen>} while <Bedingung>; # Spezialfall: in dieser Form do {<Anweisungen>} until <Bedingung>; # mindestens eine Ausführung
Nachgestellte Kontrollstrukturen
Die oberhalb aufgezählten Kontrollstrukturen beziehen sich auf einen Block mit mehreren Anweisungen. Bei einzelnen Anweisungen kann man auch die verkürzte, nachgestellte Schreibweise wählen, die auch den (englischsprachigen) Lesern das Verständnis durch natürlichsprachige Formulierung erleichtert.
<Anweisung> if <Bedingung>; <Anweisung> unless <Bedingung>; <Anweisung> for <Liste>; <Anweisung> while <Bedingung>; <Anweisung> until <Bedingung>;
Reguläre Ausdrücke
Als eine der ersten Programmiersprachen erlaubte Perl den Gebrauch Regulärer Ausdrücke (Regex) und setzte dabei den Standard PCRE, welcher etwa dem Stand von Perl 5.0 entspricht und von bedeutenden Sprachen wie Java, Python, Ruby und auch PHP aufgegriffen wurde. Heute unterstützen fast alle neueren Programmiersprachen Regex, was auch von professionellen Programmierern meist erwartet wird.
Seit Version 5.0 hat Perl seine Regex-Fähigkeiten um viele Funktionen, wie etwa Rückwärtsreferenzen, erweitert. Auch lassen sich Reguläre Ausdrücke in Perl wesentlich direkter als z. B. in Java mit dem =~-Operator verwenden, da sie Kernbestandteil der Sprache sind und nicht eine zuschaltbare Bibliothek. Der eigentliche Reguläre Ausdruck wird mit Schrägstrichen als Begrenzungszeichen notiert. Weil häufig Schrägstriche auch innerhalb Regulärer Ausdrücke vorkommen können, dürfen auch viele andere Zeichen zur Begrenzung verwendet werden. Das verbessert die Lesbarkeit, weil man so Zeichen wählen kann, die sich vom Inhalt des Regulären Ausdrucks abheben.
Perl kennt zwei Befehle für Reguläre Ausdrücke, deren Verhalten mit vielen nachgestellten Optionen verändert werden kann.
- Der m-Befehl steht für match, was Übereinstimmung bedeutet. Das m kann weggelassen werden, wenn man die Standardbegrenzungszeichen für Reguläre Ausdrücke, nämlich Schrägstriche, verwendet. Der folgende Ausdruck durchsucht den Inhalt der Variable $var und liefert einen Array von Zeichenketten, auf die der Suchausdruck passt. Mit aktivierter g-Option liefert die Suche im Listenkontext alle Funde, deaktiviert alle erkannten Subausdrücke. Im Skalarkontext liefert der Ausdruck einen positiven Wert wenn der Suchausdruck gefunden wurde, mit g-Option die Anzahl der Funde. i lässt Groß- und Kleinschreibung ignorieren, o Variablen nur einmal interpolieren, m den String als mehrzeilig und s als einzeilig betrachten. Die x-Option ermöglicht es, den Suchausdruck der besseren Lesbarkeit wegen über mehrere Zeilen zu verteilen und ihn mit Kommentaren zu versehen.
$var =~ [m]/<Suchausdruck>/[g[c]][i][m][o][s][x];
- Der s-Befehl steht für substitute, was ersetzen bedeutet. Er ersetzt den Teil des gegebenen Textes, auf den der Suchausdruck passt mit dem Ersatzausdruck.
$var =~ s/<Suchausdruck>/<Ersatzausdruck>/[e][g][i][m][o][s][x];
Nach erfolgreicher Verwendung eines Regulären Ausdruckes stehen folgende Sondervariablen zur Verfügung:
- $& – der erkannte String
- $’ – String vor dem erkanntem String
- $' – String nach dem erkanntem String
- $1..$n – Ergebnisse der geklammerten Subausdrücke
- $+ – der letzte erkannte Subausdruck
- @- – Start-Offsets der Treffer und Subtreffer
- @+ – dazugehörige End-Offsets
Der oft in einem Atemzug mit m() und s() beschriebene Operator tr() hat mit ihnen nur die Schreibweise gemein. Er lehnt sich an den UNIX-Befehl tr an, der dem Ersetzen einzelner Zeichen dient. Synonym kann statt tr auch y geschrieben werden.
$var =~ tr/<Suchzeichen>/<Ersatzzeichen>/[c][d][s];
Neben diesen beiden kann auch der Befehl split erwähnt werden, der eine Zeichenfolge aufteilt anhand eines Trennzeichens, das auch ein regulärer Ausdruck sein darf.
Quoting und Interpolation
Quoting-Operatoren:
- q – quote nicht interpretierter String
- qq – quote interpretierter String
- qw – quote words, eine Liste von mit Whitespace (Leerraum) getrennten Strings
- qr – quote regex
- qx – quote auszuführende externe Anwendung
Alternatives Quoting und Variableninterpolation führen zu besonders gut lesbarem Code. Ein Beispiel zur Verdeutlichung:
- Stringverkettung und Quotingzeichen im Text machen den Code schlecht lesbar.
$text = 'He\'s my friend ' . $name . ' from ' . $town . '.' .' ' . $name . ' works in company "' . $company . '" for ' . $years . ' years.';
- Interpolation von Variablen im String machen das Ergebnis jetzt erkennbar. Escapes \ stören noch den Textfluss.
$text = "He's my friend $name from $town. $name works in company \"$company\" for $years years.";
- Austausch des Quotingzeichens macht Escapes überflüssig. Der Code ist nun optimal. qq leitet das Quoting von Variablen im String ein. Das beliebige Zeichen danach ist das Quotingzeichen für diesen String.
$text = qq{He's my friend $name from $town. $name works in company "$company" for $years years.};
Perl-Kultur und Spaß
Gemeinschaft
Wie auch bei anderen Projekten freier Software, gibt es zwischen vielen Entwicklern und Benutzern der Sprache besondere soziale Bindungen und es bildete sich eine Kultur die von Offenheit, Gastlichkeit und Hilfsbereitschaft aber auch von Individualismus, Spieltrieb und Humor geprägt ist. Anfangs war sicher Larry Wall hierfür ein Vorbild, da er durch andere Projekte wie rn oder patch bereits bei der Veröffentlichung von Perl eine prominente Position in UNIX-Entwicklerkreisen hatte, doch mitlerweile zählen auch Randal L. Schwartz, Damian Conway, Audrey Tang, Brian Ingerson und Adam Kennedy zu den Leitfiguren, die durch ihre Arbeiten innerhalb der "Szene" große Beachtung finden. Im Gegensatz zu kommerziellen Programmiersprachen lassen sich fast alle Aktivitäten auf persönliche Motivationen zurückführen. Dementsprechend ist die Perl Foundation eine reine Freiwilligen-Organisation, die sich als Angelpunkt einer sich selbst verwaltenden Gemeinschaft versteht, die unter anderem mit perlmonks.org das zentrale Austauschforum der Perl-Programmierer unterstützt.
Treffen, Workshops und Konferenzen
Lokale Benutzergruppen, die meist ein oder zweimal im Monat zu zwanglosen Treffen einladen, bei denen auch Vorträge gehalten werden können, nennen sich Perl Mongers und sind in über 200 größeren Städten auf der ganzen Welt zu finden. Größer, wesentlich straffer organisiert und meist landesbezogen sind die jährlichen Workshops, von denen der gut etablierte Deutsche Perl-Workshop[5] einer der ersten war. Workshops wollen ambitionierte Entwickler in einem möglichst erschwinglichen Rahmen lokal zusammenzuführen. Eine ähnliches Ziel haben die größeren YAPCs (Yet Another Perl Conferences), die für die Regionen Nordamerika, Europa, Asien und Israel abgehalten werden. Am größten, allerdings auch am teuersten ist die von O’Reilly in den USA ausgerichtete The Perl Conference (TPF), die mitlerweile Teil der OSCON ist.
Disziplinen
Viele Spracheigenschaften von Perl laden dazu ein, Programmcode kreativ zu gestalten. Dies hat zu verschiedenen intellektuellen, teils humorvollen, teils skurrilen Wettbewerben und Traditionen um die Programmiersprache Perl geführt.
- Golf
- Golf ist eine Sportart für Programmierer, bei der das kürzeste Programm (in ASCII-Zeichen), das eine gestellte Aufgabe vollständig erfüllt, gewinnt. Da Perl viele, teils trickreiche Kürzel und Abkürzungen gängiger Techniken kennt, ist dies eine besonders populäre Disziplin unter Perl-Programmierern.
- Poesie
- Da Perl viele Elemente der englischen Sprache beinhaltet, gibt es regelrechte Wettbewerbe, in welchen die besten Beispiele in Perl-Poesie prämiert werden. Neben der freien Form, die lediglich Perl zum Inhalt hat, wird hier versucht, Gedichte zu schreiben, die vom Interpreter ohne Warnungen und Fehlermeldungen ausgeführt werden[6]. Daneben gibt es auch noch einen Perl-Haiku-Wettbewerb, der dieser japanischen Gedichtform gewidmet ist.
- Obfuscation
- Sehr berühmt und berüchtigt ist auch die Disziplin obfuscation, für die es auch einen jährlichen Wettbewerb (den „Obfuscated Perl Contest“) gibt, der am ehesten mit dem International Obfuscated C Code Contest vergleichbar ist, den Larry Wall selbst zweimal gewann. Hier wird danach gestrebt, auf ungewöhnliche und kreative Art und Weise die Funktion eines Programms zu verschleiern. Dies ist in Perl besonders leicht, da es für fast alles Kürzel gibt, die Sprache selbst sehr dynamisch ist und viele Dinge abhängig vom Kontext automatisch geschehen, was auch oft als „Perl-Magie“ bezeichnet wird. Ein Beispiel von Mark Jason Dominus, das 2000 beim 5ten Annual Obfuscated Perl Contest den zweiten Preis gewann (dieses Programm gibt den Text "Just another Perl / Unix hacker" aus):
@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{ @p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord ($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&& close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print
- JAPH
- Eine Art Unterkategorie von obfuscation ist die von Randal L. Schwartz begründete Disziplin JAPH. Das sind Signaturen, die kleine Perl-Programme enthalten, welche meist nur den Namen des Autors oder eine Botschaft auf eine möglichst nicht nachvollziehbare Art ausgeben. Die Buchstaben JAPH sind die Anfangsbuchstaben von Schwartz' Signatur Just Another Perl Hacker.
- Perligata
- Das Perl-Modul Lingua::Romana::Perligata von Damian Conway ist wohl eines der skurrilsten Module schlechthin: Es ermöglicht dem Benutzer, Perl komplett in Latein zu schreiben. Wie in der lateinischen Sprache ist die Satzstellung (weitgehend) irrelevant für die Bedeutung eines Ausdrucks, stattdessen werden die Bezüge zwischen einzelnen Wörtern durch ihre Flexion hergestellt. Von Variablen bis Referenzen und mehrdimensionalen Arrays ist alles in dieser neuen Sprachdefinition vorhanden. Nahezu alle Sonderzeichen wurden aus der Sprache entfernt, Variablen gleichen Namens, aber unterschiedlicher Struktur (Beispielsweise $next und @next) werden dekliniert, um die entsprechende Variable zu adressieren. Etwas Beispielcode:
insertum stringo unum tum duo excerpemento da. # Entspricht: substr($string,1,2) = $insert; clavis hashus nominamentum da. # Entspricht: @keys = keys %hash;
- Aus ähnlichem Antrieb entstanden „Sprach-Module“ für Klingonisch, Borg oder Leetspeak. Solche Module sind ein gutes Beispiel für den Zeitaufwand, den viele Leute Perl widmen; Perl kann man in diesem Sinne durchaus als Hobby bezeichnen.
- Acme
- Brian Ingerson legte mit seinem bekannten Modul namens Acme, das unmittelbar nichts weiter tut, als dem Benutzer zu bescheinigen, sein Programm habe den Höchstgrad an Perfektion erreicht, einen Grundstein für eine CPAN-Kategorie von Modulen, die keinen produktiven Nutzen haben, sogar oft bewusst kontraproduktiv sind oder eine Funktion vorgeben, die unmöglich so erreicht werden kann und eher als Witz zu verstehen ist. Dieses Spiel mit skurrilen Ideen umfasst beeindruckende ASCII-Art, Module, die den Quellcode unsichtbar machen (Acme::Bleach) oder sonstig humorvoll manipulieren, indem sie ihn zum Beispiel mit typischen Sprachfehlern des Präsidenten Bush versehen oder Methoden zufällig löschen, was die Anwesenheit einer diebischen Elster simulieren soll.
Mottos und Zitate
Es gibt viele bekannte Mottos und Zitate, die sich mit Perl selbst oder den Möglichkeiten der Sprache beschäftigen; hier einige Kostproben:
- Vorlage:"-en
(Perl: Die Schweizer Armee-Kettensäge der Programmiersprachen.)
- Vorlage:"-en
(Perl ist die einzige Sprache, die vor und nach einer RSA-Verschlüsselung gleich aussieht.)
- Vorlage:"-en
(Nur perl kann Perl parsen.)
- Vorlage:"-en
(… wir witzeln oft, dass ein Kamel ein Pferd ist, das von einem Komitee entworfen wurde. Aber wenn man darüber nachdenkt ist das Kamel ziemlich gut an das Leben in der Wüste angepasst. Das Kamel hat sich dahin entwickelt, autark zu sein. Andererseits hat es sich nicht dazu entwickelt, gut zu riechen. Perl auch nicht.)
- Vorlage:"-en
(Genau die Tatsache, dass es möglich ist, unsaubere Programme in Perl zu schreiben, ermöglicht es, Programme zu schreiben, die sauberer sind, als in Sprachen, die versuchen, Sauberkeit zu erzwingen.)
Weitere Informationen
- Wettbewerbe
Im Jahr 2004, beim 7. Wettbewerb des International Conference on Functional Programming Contest erreichte Perl eine Platzierung in der Lightning Division.
Literatur
- Für Programmier-Anfänger
- Brigitte Jellinek, Jutta Hämmerle-Uhl: Easy Perl. Markt und Technik, München, 2001, ISBN 3827261538 (Zielrichtung Web/CGI)
- Joachim Ziegler: Programmieren lernen mit Perl. Springer, Berlin, 2002, ISBN 354042685X
- Für Perl-Einsteiger
- Larry Wall u. a.: Programmieren mit Perl. O’Reilly Verlag, ISBN 3-89721-144-0 (das Kamel-Buch)
- Randal L. Schwartz, Tom Phoenix: Einführung in Perl. O’Reilly Verlag, ISBN 3-89721-434-2 (das Lama-Buch)
- Michael Schilli: GoTo Perl 5. Addison-Wesley, 1998, ISBN 3827313783 (deutsch)
- Johan Vromans: Perl – kurz und gut. O’Reilly Verlag, ISBN 3-89721-247-1 (Kurzreferenz)
- Für Fortgeschrittene
- Christiansen, Torkington: Perl Kochbuch. O’Reilly Verlag 2004, ISBN 3-89721-366-4 (Problemlösungen mit Codebeispielen)
- Joseph N. Hall, Randal L. Schwartz: Effective Perl Programming. Addison-Wesley Professional, ISBN 0201419750 (Stärken von Perl effektiv nutzen)
- Randal L. Schwartz, Tom Phoenix: Einführung in Perl-Objekte, Referenzen & Module. O’Reilly Verlag 2003, ISBN 3-89721-149-1 (das Alpakabuch)
- (dt. Übers. Jørgen W. Lang – Fortsetzung des Lama-Buches)
- Damian Conway: Object Oriented Perl. Manning 2000, ISBN 1884777791 (englisch)
- (in schlechter Übersetzung) deutsch bei Addison-Wesley 2001: Objektorientiert Programmieren mit Perl. ISBN 3827318122
- Mark Jason Dominus: Higher-Order Perl. Morgan Kaufmann, 2005, ISBN 1558607013 (Funktionale Programmierung in Perl)
- Randall, Sugalski, Tötsch: Perl 6 & Parrot Essentials. O’Reilly 2004, ISBN 0-596-00737-X
Weblinks
Allgemeine Informationen
- perl.org - Offizielle, sehr umfangreiche Website von Perl (englisch)
- Linkkatalog zum Thema Perl bei odp.org (ehemals DMOZ)
- activestate.com - Perl vorkompiliert für Windows und ein Cookbook-Archiv Mit von Benutzern beigesteuerten „Kochrezepten“ (englisch)
Deutsche Hilfe zu Perl
- Deutsche Übersetzung der Perl-Dokumentation
- Deutsches Perl-Tutorial für Einsteiger
- Information zu Perl (Bereich bei SELFHTML)
- Mason- und Perl-Tutorials
Perl-Benutzer
- Deutschsprachige Perl Mongers – Lokale Benutzergruppen
- Materialsammlung deutscher Perl-Benutzer
- Internationales Internetforum der Perl-Benutzer (englisch)
Quellen
- ↑ Der erste Teil der offiziellen Perl-FAQ (englisch)
- ↑ manpage von Perl 1.0 in der Perl-Timeline (englisch) auf perl.org
- ↑ Larry Walls Rede auf der OSCON 2000 als perl.com-Artikel (englisch)
- ↑ Perl6 Community Development Server: Perl6::Perl5::Differences -- Differences between Perl 5 and Perl 6 (englisch), Stand: 5. September 2006
- ↑ Deutscher Perl-Workshop
- ↑ zum Beispiel perlmonks.org - Perl-Poetry-Kategorie (engl.)