„Perl (Programmiersprache)“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
Keine Bearbeitungszusammenfassung |
K →Aktuelle Versionen: bugfix release |
||
Zeile 1: | Zeile 1: | ||
{{ |
{{Weiterleitungshinweis|PERL|Zu weiteren Bedeutungen siehe [[Perl]].}} |
||
{{Infobox Programmiersprache |
|||
| Name = |
|||
{{Infobox_Software| |
|||
| Logo = |
|||
Name=Perl |
|||
| Beschreibung = |
|||
|Screenshot= |
|||
| Erscheinungsjahr = 1987 |
|||
|Beschreibung= Interpretierte Programmiersprache |
|||
| |
| Entwickler = Larry Wall, ''Perl Porter'' |
||
|AktuelleVersion= |
| AktuelleVersion = <!-- kommt aus Wikidata --> |
||
|AktuelleVersionFreigabeDatum= |
| AktuelleVersionFreigabeDatum = <!-- kommt aus Wikidata --> |
||
| AktuelleVorabVersion = |
|||
|Betriebssystem= [[Microsoft Windows|Windows]], [[Linux]], [[Mac OS X]] uvm. |
|||
| AktuelleVorabVersionFreigabeDatum = |
|||
|Kategorie= [[Skriptsprache]] |
|||
| Typisierung = [[Schwache Typisierung|schwach]], [[Dynamische Typisierung|dynamisch]], [[Typinferenz|implizit]] |
|||
|Lizenz= [[Artistic License]] [[GPL]] |
|||
| Betriebssystem = [[Plattformunabhängigkeit|plattformunabhängig]] |
|||
|Website= [http://www.perl.org/ www.perl.org] |
|||
| Beeinflusst_von = [[awk]], BASIC-PLUS<ref>Larry Wall: [https://www.perl.com/pub/2007/12/06/soto-11.html/ ''Programming is Hard, Let’s Go Scripting …''] auf perl.com vom 6. Dezember 2007; abgerufen am 1. Juni 2019.</ref>, [[C (Programmiersprache)|C]]/[[C++]], [[Lisp]], [[Pascal (Programmiersprache)|Pascal]], [[Python (Programmiersprache)|Python]],<ref>Larry Wall: [http://www.wall.org/~larry/pm.html ''Perl, the first postmodern computer language''], abgerufen am 31. Dezember 2018.</ref>[[Raku (Programmiersprache)|Raku]],<ref>[https://perldoc.perl.org/perlfaq1#What-is-Raku-(Perl-6)? ''What is Raku (Perl 6)?''] im Perlfaq</ref> [[Sed (Unix)|sed]], [[Smalltalk (Programmiersprache)|Smalltalk]], [[Unix-Shell]] |
|||
| Beeinflusste = [[PHP]], [[Ruby (Programmiersprache)|Ruby]], [[Python (Programmiersprache)|Python]], [[JavaScript]], [[Windows PowerShell]] |
|||
| Lizenz = [[GNU General Public License|GPL]] und [[Artistic License]] |
|||
| Website = [https://www.perl.org/ www.perl.org] |
|||
| Paradigma = [[Prozedurale Programmierung|prozedural]], [[Modulare Programmierung|modular]], [[Objektorientierte Programmierung|objektorientiert]] (seit Perl 5) |
|||
}} |
}} |
||
'''Perl''' [{{IPA|pɝːl}}] ist eine [[Freie Software|freie]], [[Plattformunabhängigkeit|plattformunabhängige]] und [[Interpreter|interpretierte]] [[Programmiersprache]], die mehrere [[Programmierparadigma|Paradigmen]] unterstützt. |
|||
'''Perl''' /{{IPA|pɜːɹl}}/ ist eine [[Open Source|freie]], [[Plattformunabhängigkeit|plattformunabhängige]] [[Programmiersprache]] und wird auch als [[Skriptsprache]] oder ''dynamic language'' bezeichnet. Der Linguist [[Larry Wall]] entwarf sie 1987 als [[Synthese]] aus [[C_(Programmiersprache)|C]], den [[UNIX]]-Befehlen und anderen Einflüssen. Ursprünglich als Werkzeug zur [[Systemadministrator|System- und Netzwerkadministration]] vorgesehen, hat Perl auch bei der Entwicklung von [[Webanwendung]]en und in der [[Bioinformatik]] weite Verbreitung gefunden. Hauptziele sind eine schnelle Problemlösung und größtmögliche Freiheit für Programmierer. Der Umgang mit Texten und viele frei verfügbare Module sind Stärken der Sprache. |
|||
Der Name Perl bezieht sich auf ein Zitat aus dem [[Evangelium nach Matthäus|Matthäus-Evangelium]] [13,46], wo [[Jesus von Nazareth|Jesus]] das Himmelreich mit dem Bild eines Händlers beschreibt, der seinen gesamten Besitz verkaufen will, um eine kostbare Perle zu erwerben. Später wurde der Name von Pearl in Perl geändert, da es bereits eine [[Pearl (Programmiersprache)|Sprache namens Pearl]] gab. Allgemein verbreitet und von Larry akzeptiert sind auch die [[Backronym]]e ''Practical Extraction and Report Language'' und ''Pathologically Eclectic Rubbish Lister''. Die Schreibweise „Perl“ bezeichnet die Sprache, „perl“ dagegen das Programm, das diese Sprache interpretiert. |
|||
Der [[Sprachwissenschaft|Linguist]] [[Larry Wall]] entwarf sie 1987 als [[Synthese]] aus [[C (Programmiersprache)|C]], [[awk]], den [[Unix]]-Befehlen und anderen Einflüssen. Ursprünglich als Werkzeug zur Verarbeitung und Manipulation von Textdateien insbesondere bei der [[Systemadministrator|System- und Netzwerkadministration]] vorgesehen (zum Beispiel für die Auswertung von [[Logdatei]]en), hat Perl auch bei der Entwicklung von [[Webanwendung]]en und in der [[Bioinformatik]] weite Verbreitung gefunden. Traditionell vertreten ist Perl auch in der Finanzwelt, vor allem bei der Verarbeitung von Datenströmen verschiedenartiger Nachrichtenquellen. Hauptziele sind eine schnelle Problemlösung und größtmögliche Freiheit für Programmierer. Die Bearbeitung von Texten mit Hilfe [[Regulärer Ausdruck|regulärer Ausdrücke]] und ein großer Gestaltungsspielraum sind Stärken der Sprache. Perl zählt zu den [[Allzweck-Programmiersprache|Allzweck-Programmiersprachen]]. |
|||
== Geschichte == |
== Geschichte == |
||
=== Entstehung === |
=== Entstehung === |
||
[[Datei:Larry Wall YAPC 2007.jpg|mini|hochkant|[[Larry Wall]] entwarf Perl.]] |
|||
Larry Wall war Angestellter bei [[Unisys]], wo er [[1987]] daran beteiligt war, unter dem Namen ''blackcomb'' ein verstreutes, sicheres Netzwerk für die [[National Security Agency|NSA]] zu entwickeln. Er erhielt dabei mehrere Aufträge, Werkzeuge zur Fernwartung und Überwachung der entstehenden [[Software]] zu schaffen. Da die vorhanden Sprachen und Werkzeuge ihm dafür zu umständlich erschienen, entwickelte er eine eigene Sprache, um seine Aufgaben zu lösen. |
|||
Larry Wall war als Administrator und Programmierer bei dem Unternehmen [[Unisys]] angestellt, wo er seit März 1987 daran beteiligt war, unter dem Namen ''blacker'' ein sicheres Netzwerk für die [[National Security Agency|NSA]] zu entwickeln. Er erhielt mehrere Aufträge, Werkzeuge zur Überwachung und Fernwartung der entstehenden [[Software]] zu schaffen. Eine Hauptaufgabe war dabei, übersichtliche Berichte aus verstreuten [[Logdatei]]en zu erzeugen. Da ihm die vorhandenen Sprachen und Werkzeuge 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 [[Sprachwissenschaft|Linguist]] zurück und entwarf Perl nahe 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 [[Intuition|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 [[Compiler|kompiliert]] und meist in [[C (Programmiersprache)|C]] geschrieben. Diese Befehle waren logische Einheiten und sollten genau eine Aufgabe beherrschen: „Do one thing and do it well“ („Mach genau eine Sache und mach sie gut“). Interpretierte [[Unix-Shell|Shell]]-Skripte kombinierten schnell und einfach die Befehle, die untereinander ihre Ergebnisse durch [[Pipe (Informatik)#Unix|Pipes]] weiterreichen konnten. Perl verletzt diese Philosophie, indem es diese Befehle zum Bestandteil der Programmiersprache macht, also [[C (Programmiersprache)|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#Informatik|Daten]] nur eingeschränkt zwischenspeichern und die Pipes sind Flaschenhälse beim [[Datenaustausch]]. Andererseits erlauben sie einen wesentlich kompakteren Programmierstil, da die Benutzung eines UNIX-Werkzeugs 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 (Unix)|sed]], [[awk]], [[grep]] und [[sort (Unix)|sort]]. Er fügte Eigenschaften der [[Unix-Shell#Die Bourne-Shell|Bourne Shell]], in geringem Maße auch Elemente aus [[Pascal (Programmiersprache)|Pascal]] und [[BASIC]], sowie eigene Ideen dazu.<ref>manpage von Perl 1.0 in der [http://history.perl.org/PerlTimeline.html#1980s ''Perl-Timeline''.] auf perl.org (englisch)</ref> 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 (Programmiersprache)|Smalltalk]], [[Python (Programmiersprache)|Python]] oder [[Ruby (Programmiersprache)|Ruby]] „importiert“. |
|||
=== Name === |
|||
Der Name Perl bezieht sich auf ein Zitat aus dem [[Evangelium nach Matthäus|Matthäus-Evangelium]] {{Bibel|Mt|13|46}},<ref>Kate Johanns: [https://smartermsp.com/tech-time-warp-why-perl-the-duct-tape-of-the-internet-was-such-a-gem/ ''Tech Time Warp: Why Perl — the “duct tape of the internet” — was such a gem''] SmarterMSP, 20. Dezember 2019, abgerufen am 15. November 2020.</ref> in dem [[Jesus von Nazaret|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 [[Backronym]]e ''Practical Extraction and Report Language'' (zweckmäßige Extraktions- und Berichtssprache) und ''Pathologically Eclectic Rubbish Lister'' (krankhaft stilmischender 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, da es sich nun mal nicht um ein [[Akronym]] handelt.<ref>[http://perldoc.perl.org/perlfaq1.html#What%27s-the-difference-between-%22perl%22-and-%22Perl%22%3F Der erste Teil der offiziellen Perl-FAQ] (englisch)</ref> |
|||
=== Perl 1 bis 4 === |
|||
[[Datei:Jet Propulsion Laboratory sign.jpg|mini|hochkant=1.4|[[Larry Wall]] war zu dieser Zeit Angestellter des [[Jet Propulsion Laboratory]] (JPL).]] |
|||
Am 18. Dezember 1987<ref>[http://search.cpan.org/dist/perl-5.14.2/pod/perlhist.pod Tabelle aller Erscheinungsdaten von Perl] (POD-Dokument; englisch) in der offiziellen CPAN-Distribution</ref> publizierte Larry Wall sein Programm im [[Usenet]] als Perl 1.0, das damals noch eine mächtigere 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 [[Regulärer Ausdruck|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 [[GNU General Public License|GPL]] gewählt. |
|||
Fast unverändert war es ab dem 21. März 1991 als Perl 4 erhältlich, jedoch nun [[Mehrfachlizenzierung|wahlweise]] unter der GPL oder der von Larry Wall entwickelten [[Artistic License]]. Der eigentliche Grund für die neue Version war aber das gleichzeitig erschienene [[#Literatur|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-''[[Manpage|man-pages]]'' die einzige verfügbare 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 Publikationen, was sich erst im neuen Jahrtausend etwas relativierte. Der Verlag betrieb auch unter der Internetadresse ''perl.com'' das meistbesuchte Online-Magazin für Perl-Programmierung und veranstaltet mit der ''TPC'' (The Perl Conference – heute [[O’Reilly Open Source Convention|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 und entwickelte Perl 5 vollständig neu. |
|||
=== Perl 1–4 === |
|||
Am [[18. Dezember]] 1987 publizierte er sie im damaligen Vorläufer des Internets als Perl 1.0. Damals war Perl wirklich noch, wie der Name sagt, eine bessere Shell, die gut mit Texten und Dateien umgehen konnte, andere Programme steuern und gut lesbare Berichte ausgeben konnte. Bereits im nächsten Jahr erschien die Version 2.0 mit grunderneuerter und erweiterter [[Regulärer Ausdruck|Regex]]-Engine und einigen weiteren Verbesserungen. [[1989]] folgte Perl 3, das auch mit binären Daten umgehen konnte und erstmals auch unter der [[GNU General Public License|GPL]] veröffentlicht wurde. Fast unverändert war es ab dem 12. März [[1991]] als Perl 4 erhältlich. Jedoch nun wahlweise unter der GPL oder der von Larry entwickelten [[Artistic License]]. |
|||
=== Perl 5 === |
=== Perl 5 === |
||
[[Datei:Cpan.jpg|mini|[[CPAN]]: Eines der größten Archive [[Freie Software|freier Software]]]] |
|||
Der bisher größte Schritt für Perl war am 18. Oktober [[1994]] mit '''Perl 5''' geschafft. Neben der Möglichkeit, Dokumentation in den Quelltext einzufügen, und vielen weiteren wichtigen Neuerungen, konnte man nun die Sprache durch separate Module erweitern, was im folgendem Jahr zur Entstehung des [[CPAN]] führte. Dieses große Archiv frei erhältlicher Module ist heute selbst ein wichtiger Grund Perl einzusetzen. |
|||
Mit Version 5 wurde es auch möglich, [[objektorientierte Programmierung|objektorientiert]] in Perl zu programmieren, wobei die objektoriente Syntax geschickt aus anderen Sprachelementen (Packages, Package-Funktionen und Package-Variablen) abgeleitet wurde. |
|||
In der Anfangszeit von Perl 5 enstand aus einem Satz C-[[Makro]]s mit XS eine Sprache, die es ermöglicht Perl mit anderen Sprachen zu erweitern oder mit Perl-Programmen beliebige Software anzusprechen. |
|||
Perl 5.0 wurde am 18. Oktober 1994 veröffentlicht und war der bis dahin größte Fortschritt für die Sprache. Mit [[Plain Old Documentation]] konnte man nun formatierte [[Technische Dokumentation|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 wurde schließlich selbst ein wichtiger Grund, Perl einzusetzen. Eine weitere, wichtige Neuerung war die Einführung von [[Referenz (Programmierung)|Referenzen]], die erstmals eine einfache Erstellung zusammengesetzter [[Datenstruktur]]en erlaubte. |
|||
=== 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.7 ist weitestgehend befreit von den Problemen mit [[Unicode]] und [[Thread]]s, 5.6.2 ist Alternative wegen kleiner Inkompatibilitäten. 5.004 und 5.005 sind veraltet, wichtige Module funktionieren mit ihnen aber weiterhin. Die nächste Benutzerversion 5.10 wird von Hugo van der Sanden vorbereitet. |
|||
Mit Version 5 wurde es auch möglich, [[Objektorientierte Programmierung|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 <code>bless()</code> zum Anlegen eines Objektes und der Pfeil-Operator (<code>-></code>) zum Aufruf von [[Methode (Programmierung)|Methoden]] kamen hinzu (der Pfeil-Operator ist eigentlich der Dereferenzierungsoperator, der aus einem Objekt, das aus einer Referenz auf die Klasse besteht, eine bestimmte Methode dereferenziert). Es entstand auch XS, eine [[Schnittstellenbeschreibungssprache]], die es ermöglicht, Perl-Programme mit anderen Sprachen zu erweitern oder mit Perl-Programmen beliebige Software oder [[Hardware]] anzusprechen. |
|||
=== Perl 6 === |
|||
Am [[18. Juli]] [[2000]] auf der [[Perl#Konferenzen und Workshops|TPC 4]] 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 [[Mailingliste]]n von Damian Conway zu einer detaillierten ''[[Exegese]]'' formuliert wird. Dabei wird die Sprache entrümpelt und mit neuen Fähigkeiten ausgestattet, unter anderem wurde die Objektorientierung komplett neu gestaltet und eine neue Grammar-Engine etwickelt. Diese Neugestaltung der [[Syntax]] ist weitestgehend abgeschlossen. |
|||
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 Porters,'' die über die im Mai 1994 gegründete p5p-Mailingliste kommunizieren, aber auch zunehmend über einen eigenen [[Programmfehler|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. |
|||
Als Interpreter für Perl 6 ist eine neue [[Register (Computer)|register]]basierte [[Virtuelle Maschine]] namens '''[[Parrot]]''' in Entwicklung, die viele Sprachen kompilieren (in [[Bytecode]] übersetzen) und ausführen können soll. Sie wurde von Chip Salzenberg und Dan Sugalski entworfen und wird derzeit von Chip und Leo(pold) Tötsch betreut. |
|||
In den Jahren nach Version 5.0 wurde nicht nur Perl auf Macintosh und Windows portiert, sondern es verschob sich auch die Nummerierung der Versionen. Da sich an der Syntax nichts Wesentliches änderte, beließ man die 5 und erhöhte bei größeren Meilensteinen die erste Nachkommastelle, verwendete aber zusätzliche Nummern, um die Zwischenschritte zu zählen. Da Perl erst ab 5.6 mit Versionsnummern, die mehrere Kommata enthalten, umgehen konnte, wurden sie bis dahin z. B. Perl 5.001 oder Perl 5.001012 geschrieben. Ab 5.6 wurde auch das damals von [[Linux]] verwendete Versionsschema übernommen, bei dem gerade Nummern auf Fehlerfreiheit gepflegte Benutzerversionen hindeuten und ungerade auf Entwicklerversionen, in die neue Funktionen einfließen. Serien von Benutzerversionen (z. B. 5.8.x) werden untereinander binär kompatibel gehalten, was bedeutet, dass ein für Perl 5.8.7 kompiliertes Binärmodul auch mit 5.8.8, nicht jedoch zwingend mit 5.10 oder 5.6.1 funktioniert. |
|||
Nach der Freigabe von Perl 6 und Parrot soll Perl 5 aber noch lange gewartet werden. Mit einem [[Parser]] namens '''[[Ponie]]''', den [[Arthur Bergman]] derzeit entwickelt, soll Perl 5 auch auf Parrot ausführbar sein. |
|||
''' Perl 5.6 ''' |
|||
[[Autrijus Tang]] entwickelt seit Anfang Februar [[2005]] einen alternativen Perl 6-[[Compiler]] namens '''[[Pugs]]''' in der Sprache [[Haskell (Programmiersprache)|Haskell]]. Die Entwicklung geht wesentlich schneller als beim Parrot-Projekt voran und wird es auch ermöglichen, wie geplant den Perl 6-Parser für Parrot in Perl 6 zu schreiben. |
|||
Diese Version brachte am 22. März 2000 einige neue experimentelle Fähigkeiten, die erst später ausreiften, wie [[Unicode]] und UTF-8, [[Thread (Informatik)|Threads]] und cloning. Auch 64-Bit-Prozessoren konnten nun genutzt werden. Sprachlich fügte diese von Gurusamy Sarathy geleitete Reihe vor allem lexikalisch globale Variablen (mit <code>our</code>) und eine Vektorschreibweise, die den Vergleich mehrstelliger Versionsnummern erlaubt, sowie die Spezialvariablen <code>@-</code> und <code>@+</code>, ein. |
|||
== Merkmale == |
|||
''' Perl 5.8 ''' |
|||
=== Ursprung === |
|||
Mit der am 18. Juli 2002 von Nicholas Clark betreuten Reihe 5.8.x wurden vor allem die Probleme mit Unicode und den Threads behoben, aber auch die Ein-/Ausgabe (IO), [[Signal (Unix)|Signale]] und die numerische Genauigkeit wurden entscheidend verbessert. |
|||
==== Geistig ==== |
|||
Es ist naheliegend, dass sich Perls Eigenschaften aus den Gedanken und Überzeugungen ihres Begründers ergeben, der sich stark zum [[Christentum]] bekennt, [[Sprachwissenschaft|Linguistik]] studierte, als [[Systemadministrator|Admin]] und [[Programmierer]] arbeitete und auch als [[Humorist]] und Autor bekannt wurde. Aus seiner christlichen Überzeugung heraus wollte Larry Wall ein Werkzeug schaffen, das möglichst vielen Menschen als ''bescheidener Diener'' die Arbeit erleichtert, sie in ihrer [[Kreativität]] unterstützt und sie in ihrer ''von Gott geschaffenen Einzigartigkeit'' ernst nimmt. Dafür entwarf er Perl nah an den menschlichen Sprachgewohneiten, was sich in minimalen Voraussetzungen für Einsteiger, einer starken Kombinierbarkeit der Sprachelemente und einem reichen Wortschatz ausdrückt, der auch verschiedene Befehle oder Wendungen mit gleicher Bedeutung zulässt. Wall sieht darin die Bedürfnisse eines [[Praktiker]]s nach [[Freiheit]] und [[Intuition|intuitivem]] Ausdruck verwirklicht. |
|||
==== |
==== Ab Perl 5.10 ==== |
||
Neben verringertem Speicherverbrauch und einer erneuerten und nun auch austauschbaren Regex-Maschine brachte diese Version am 18. Dezember 2007 unter der Führung von Rafaël Garcia-Suarez vor allem Neuerungen, die dem Entwurf von Perl 6 entstammen und deren Gebrauch entweder einzeln oder kollektiv mit <code>use feature ':5.10';</code> angemeldet werden muss oder kürzer <code>use v5.10;</code>. Dies gilt ab dieser Version für alle Funktionen, welche die Kompatibilität brechen könnten. Hierzu zählen <code>say</code>, <code>given</code> und <code>when</code> (analog zur <code>switch</code>-Anweisung in [[C (Programmiersprache)|C]]), der ''smartmatch''-Operator (<code>~~</code>), der ''defined or''-Operator (<code>//</code>) und <code>state</code>-Variablen, welche die Erzeugung von [[Closure (Funktion)|Closures]] vereinfachen. Weitere nennenswerte Neuheiten umfassen den verlagerbaren Installationspfad, stapelbare Dateitestoperatoren, definierbare lexikalische Pragmas, optionale ''C3''-Serialisierung der [[Vererbung (Programmierung)|Objektvererbung]] und ''field hashes'' (für „inside out“-Objekte). Die Regex-Engine arbeitet nun iterativ statt rekursiv, was rekursive Ausdrücke ermöglicht. Komplexe Suchanfragen können nun auch verständlicher und weniger fehleranfällig durch ''named captures'' formuliert werden. Die Spezialvariablen <code>$#</code> und <code>$*</code> sowie die [[Interpreter]]schnittstellen ''perlcc'' und ''JPL'' wurden entfernt. |
|||
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#Merkmale|UNIX-Philosophie]] umkehrte. |
|||
Im folgenden Jahr wurden die Quelle von [[Perforce]] auf [[Git]] umgestellt, was die Entwicklung und Herausgabe neuer Versionen wesentlich vereinfachte. |
|||
Unix und seine Systembefehle waren meist in der [[Compiler|kompilierenden]] Programmiersprachen [[C (Programmiersprache)|C]] geschrieben. Durch [[Interpreter|interpretierte]] [[Unix-Shell|Shell]]-Scripte konnte man die Befehle schnell und einfach kombinieren und durch [[Pipe#Unix|Pipes]] konnten die Programme untereinander ihre Ergebnisse weiterreichen. 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”). Perl verletzt diese Philosophie in dem es diese Befehle zum Bestandteil der Sprache macht und die vorhandenen Werkzeuge übergeht. |
|||
''' Perl 5.12 ''' |
|||
Dies wurde notwendig weil für komplexe Aufgaben Shell-Scripte ungeeignet waren, da Pipes [[Nadelöhr]]e für den [[Datenaustausch]] sind, Shell-Scripte nur eingeschränkt [[Daten#Informatik|Daten]] zwischenspeichern können und ihr Ablauf sehr einfach ist. Andererseits sind UNIX-Werkzeuge sehr mächtig und konnten bis zu ca. 30 Zeilen C-[[Quelltext]] ersetzen. |
|||
Diese von Jesse Vincent geleitete Version vom 12. April 2010 beinhaltet weit weniger große und sichtbare Veränderungen als 5.10. <code>use v5.12;</code> impliziert <code>use strict;</code> und <code>use feature 'unicode_strings';</code>, wodurch alle Befehle Strings als Unicode behandeln. Unter den technischen Verbesserungen sind besonders der aktualisierte [[Unicode]] (5.2), [[DTrace]]-Unterstützung und Sicherheit von Datumsangaben jenseits von 2038 hervorzuheben, ''suidperl'' wurde entfernt. Aus Perl 6 wurden der Ellipsen-Operator (''yada-yada'') und die Regex-Escape-Sequence ''\N'' übernommen, Modulversionen können jetzt von ''package'' und ''use'' verwaltet werden. Ebenfalls neu ist die Möglichkeit, eigene Schlüsselwörter durch Perlroutinen zu definieren. Dies ist allerdings als experimentell markiert und kann sich ändern. Für bessere Planbarkeit und Zusammenarbeit mit Distributionen erscheint ab 5. Dezember 2000 am 20. jedes Monats eine Entwicklerversion, alle 3 Monate eine kleine Benutzerversion und jedes Jahr eine große. |
|||
Um die Vorteile beider ''Welten'' zu nutzen, kombinierte Larry C mit Werkzeugen wie [[sed]], [[awk]], [[grep]] und sort und Eigenschaften der [[Unix-Shell#Die Bourne Shell – sh|Bourne Shell]], in geringem Maße auch [[Pascal (Programmiersprache)|Pascal]] und [[BASIC]], sowie eigenen Ideen. 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 (Programmiersprache)|Smalltalk]], [[Python (Programmiersprache)|Python]] oder [[Ruby]] "importiert". |
|||
''' Perl 5.14 ''' |
|||
Ab 14. Mai 2011 erleichtern neue Modifikatoren und Steuerzeichen den Umgang mit [[Unicode]], der auf den Stand 6.0 gebracht wurde. Built-ins für Listen und Hashes dereferenzieren automatisch (''autoderef'') und weite Teile der Dokumentation wurden überarbeitet oder neu geschrieben. Auch die Unterstützung von [[IPv6]] wurde verbessert, sowie das Anbinden von Multithread-Bibliotheken erleichtert. |
|||
''' Perl 5.16 ''' |
|||
Die am 20. Mai 2012 herausgegebene Version beinhaltet zahlreiche syntaktische Glättungen, in Teilen erneuerte Dokumentation und den Wechsel zu Unicode 6.1. Die Leitung hatte Jesse Vincent und ab November 2011 Ricardo Signes. Durch einen neu eröffneten Spendentopf der [[The Perl Foundation|Perl Foundation]] konnten zudem zwei langjährige Entwickler dazu verpflichtet werden, undankbare Aufgaben zum Abschluss zu führen und den [[Erstellungsprozess|Build-Prozess]] zu vereinfachen. Einzige grundlegend neue Funktionalität ist das mit <code>use feature 'current_sub';</code> oder <code>use v5.16;</code> zuschaltbare [[Token (Übersetzerbau)|Token]] <code>__SUB__</code>, eine Referenz auf die aktuelle [[Unterprogramm|Routine]]. |
|||
''' Perl 5.18 ''' |
|||
Die am 18. Mai 2013 erschienenen Funktionalitäten lexikalische Subroutinen (''lexical_subs'') und mit [[Vereinigungsmenge#Durchschnitt (Schnittmenge, Schnitt)|Mengenfunktionen]] erzeugte [[Regulärer Ausdruck#Vordefinierte Zeichenklassen|Zeichenklassen]] innerhalb regulärer Ausdrücke sind beide experimentell. Solche Funktionen, zu denen auch lexikalische Kontextvariablen (''lexical_topic'') und der Smartmatch-Operator gehören, erzeugen jetzt Warnhinweise, die mit ''no warnings 'experimental::funktionsname';'' oder ''no warnings 'experimental';'' abgeschaltet werden können. Die Hashes wurden konsequent [[Randomisierung|randomisiert]], um Programme besser gegen [[Denial of Service#Funktionsweise|DoS-Attacken]] zu schützen. |
|||
''' Perl 5.20 ''' |
|||
Ebenfalls unter der Führung von Ricardo Signes kamen am 27. Mai 2014 die experimentellen Funktionalitäten der Subroutinen-Signaturen (''signatures'') und (''postderef'') eine alternative Postfix-Syntax zum Dereferenzieren. Das mit 5.14 aufgenommene ''autoderef'' wurde als experimentell herabgestuft. Unicode 6.3 wird unterstützt und mit drand48 hat Perl nun einen eigenen, plattformunabhängig guten Zufallszahlengenerator. String- und Arraygrößen sind jetzt 64-Bit Werte. |
|||
''' Perl 5.22 ''' |
|||
Mit dem 1. Juni 2015 kamen der Doppeldiamantoperator (<<>>), bitweise Stringoperatoren (&. |. ^. ~.), ein 'strict'-Modus für reguläre Ausdrücke <code>use re 'strict';</code> (''re_strict''), Unicode 7.0, [[Aliasing]] von Referenzen (''refaliasing'') und konstante Routinen (''const_attr''), die stets den mit der ersten Kompilierung ermittelten konstanten Wert liefern. Alle benannten Funktionalitäten (Name in Klammern) sind vorerst experimentell. |
|||
''' Perl 5.24 ''' |
|||
brachte am 9. Mai 2016 Beschleunigungen für [[Blockstruktur|Blöcke]] und [[Grundrechenart|numerische Operationen]], sowie Unicode 8.0. Die Features ''postderef'' und ''postderef_qq'' wurden angenommen – ''autoderef'' und ''lexical_topic'' entfernt. |
|||
''' Perl 5.26 ''' |
|||
Unter Leitung von SawyerX wurde am 30. Mai 2017 die Regex-Option xx, einrückbare [[Heredoc|''Here''-Dokumente]] und Unicode 9.0 eingeführt. Das Feature ''lexical_subs'' wurde angenommen und <code>'.'</code> (das aktuelle Verzeichnis) wurde aus Sicherheitsgründen standardmäßig aus <code>@INC</code> (der Liste von Suchpfaden für Module) entfernt. |
|||
''' Perl 5.28 ''' |
|||
Erschien am 22. Juni 2018. Nebst Unicode 10.0 erhielt Perl alpha assertions in Lang- und Kurzfassungen. Das sind Aliase für besondere [[Regulärer Ausdruck#Look-around assertions|Regex-Gruppen]] mit sprechenden Namen: zum Beispiel anstatt <code>(?=...)</code>, nun auch <code>(*positive_lookahead:...)</code> oder <code>(*pla:...)</code>. <code>(*script_run: …)</code> oder <code>(*sr: …)</code> wurde eingeführt, um einheitlich kodierten Text zu erkennen, was hilft Angriffen durch manipulierte Eingaben auszuweichen. Drei kritische Sicherheitslücken wurden geschlossen, mehrfache Dereferenzierungen und Zusammenführungen von Zeichenketten beschleunigt, sowie die Operatoren (<code>&. |. ^. ~.</code>) sind nicht mehr experimentell. Außerdem wurde beschlossen, im Dokument ''perldeprecation'' darüber Buch zu führen, wann welche Funktion (mit 2 Versionen Vorwarnzeit) entfernt wird. |
|||
''' Perl 5.30 ''' |
|||
Aktualisierte am 22. Mai 2019 auf Unicode 12.1, führte die ''Unicode Wildcard Properties'' ein und erlaubte einen ''[[Regulärer Ausdruck#Look-around assertions|lookbehind]]'' in der Länge zu begrenzen. Entfernt wurden <code>$[</code>, <code>$*</code>, <code>$#</code> und <code>File::Glob::glob</code>, sowie Variablendeklarationen in nachgestellten, bedingten Ausdrücken. |
|||
''' Perl 5.32 ''' |
|||
Führte am 20. Juni 2020 verkettete Vergleichsoperatoren (<code>$d < $e <= $f</code>), den <code>isa</code>-Operator (prüft Klassenzugehörigkeit) und Unicode 13 ein. <code>\p{name=...}</code> erlaubt es innerhalb einer Regex Ausdrücke zu Unicode-Namen zu interpolieren. |
|||
''' Perl 5.34 ''' |
|||
Am 20. Mai 2021 wurde eine [[Ausnahmebehandlung]] a la Try::Tiny (feature ''try'') in den Kern übernommen und die alternative Schreibweise für [[Oktalsystem|Oktaldarstellung]] von Literalen <code>0oddddd</code>. Die neue Dokumentationsseite ''perlgov'' schreibt den einen neuen Prozess fest, nachdem sich die Perlgemeinschaft zukünftig selbsttätig, ohne den Einfluss von Larry Wall regiert. |
|||
''' Perl 5.36 ''' |
|||
Ricardo Signes verkündete am 28. Mai 2022 Ausnahmen mit <code>finally</code>-Blöcken, <code>defer</code>-Blöcke, <code>for</code>-Schleifen mit mehreren [[Laufvariable]]n, Unicode 14, sowie eine neue Klasse an Hilfsfunktionen, welche über das Pragma <code>builtin</code> importiert werden. Signaturen und Mengenoperationen auf Zeichenklassen wurden stabil markiert und <code>use v5.36;</code> aktiviert das Pragma <code>'warnings'</code> sowie deaktiviert indirekte Methodenaufrufe <code>($x = new Class;)</code>, sowie die aus Perl 4 belassenen simulierten verschachtelten Hashes. |
|||
''' Perl 5.38 ''' |
|||
Mit 2. Juli 2023 kam eine Objektorientierung die mit den Schlüsselworten <code>class</code>, <code>method</code> und <code>field</code> arbeitet und die bisherige nicht ersetzt. Eingeführt wurden auch die Spezialvariablen <code>$ENV{PERL_RAND_SEED}</code>, <code>${^LAST_SUCCESSFUL_PATTERN}</code> und <code>%{^HOOK}</code>, sowie die buitins <code>indexed</code>, <code>is_tainted</code> und <code>export_lexically</code>. |
|||
''' Perl 5.40 ''' |
|||
Am 9. Juni 2024 wurden das Attribut <code>:reader</code> für <code>field</code> Variablen, das Token <code>__CLASS__</code> und der Operator <code>^^</code> eingeführt. Es kamen auch die builtins <code>inf</code>, <code>nan</code> und <code>load_module</code> und das <code>feature</code> ''try'' erreicht den Status stabil. |
|||
==== Aktuelle Versionen ==== |
|||
Auch wenn die neueste Benutzerversion 5.40.0 lautet, wird derzeit die Versionsreihe 5.38.x weiterhin gepflegt (aktuell ist 5.38.4). Die Versionen 5.36.3, 5.34.3, 5.32.1, 5.30.3, 5.28.3, 5.26.3, 5.24.4, 5.22.4, 5.20.3, 5.18.2, 5.16.3, 5.14.4, 5.12.5, 5.10.1 und 5.8.9 sind Schlusspunkte ihrer Reihe, sicherheitsrelevante Verbesserungen werden noch bis zu 3 Jahre nach Veröffentlichung einer Version nachgereicht. Bei Kernmodulen wird meist auf eine Kompatibilität bis zu 5.6 geachtet, bei wichtigen CPAN-Modulen meist 5.8.3. Änderungen finden im Entwicklerzweig mit ungerader Versionsnummer statt (aktuell 5.41.x), der nicht für allgemeine Benutzung bestimmt ist. Da sich Perl 6 zu einer [[Raku_(Programmiersprache)|eigenständigen Sprache]] entwickelt hat, wird die nächste große Version Perl 7 heißen. |
|||
=== Raku (Perl 6) === |
|||
Perl 6, das 2020 zu [[Raku (Programmiersprache)|Raku]] umbenannt wurde, ist eine Schwestersprache, deren Interpreter und die umgebende [[Infrastruktur]] vollständig neu entworfen wurden. |
|||
== Merkmale == |
|||
=== Prinzipien === |
=== Prinzipien === |
||
Perl wurde für den praktischen Einsatz entwickelt und konzentriert sich daher auf einfache Programmierbarkeit, Vollständigkeit und |
Perl wurde für den praktischen Einsatz entwickelt und konzentriert sich daher auf schnelle und einfache Programmierbarkeit, Vollständigkeit und Anpassbarkeit. Diese Philosophie drückt sich in den folgenden Schlagworten oder Phrasen aus, die meist von Larry Wall stammen. |
||
==== Mehrere Wege ==== |
==== Mehrere Wege {{Anker|TIMTOWTDI}} ==== |
||
Das bekannteste und grundlegendste Perl-Motto ist „There is more than one way to do it“ (deutsch: „Es gibt mehr als einen Weg, etwas zu tun“), was meist zu TIMTOWTDI (selten TMTOWTDI) oder (mit englischer [[Kontraktion (Linguistik)|Kontraktion]]) „Tim To[a]dy“ verkürzt wird.<ref>''[[wikt:en:TMTOWTDI|TMTOWTDI]]'' im englischsprachigen Wiktionary</ref> 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 <code>||</code> und <code>&&</code> (wie in C) oder (mit Bedeutungsnuancen) als <code>or</code> und <code>and</code> (wie in Pascal) schreiben; aber auch zahlreiche Befehle mit einem sich überschneidenden Funktionsumfang wie <code>map</code> und <code>for</code> erlauben verschiedene Formulierungen für den gleichen Sachverhalt. Einige Befehle wie der Diamant-Operator (<code><></code>) bieten verkürzte Schreibweisen für bereits vorhandene Funktionalität (hier wäre, mit leichten Unterschieden, <code><STDIN></code> äquivalent, was jedoch viel länger zu schreiben wäre). Diese Vielfalt wird auch im [[CPAN]] sichtbar, wo oft mehrere Module einen sehr ähnlichen Zweck erfüllen oder einen, der ebenso (wenn auch umständlicher) ad hoc implementiert werden könnte (Beispiel <code>Getopt::Long</code><ref>[http://metacpan.org/module/Getopt::Long Getopt::Long] auf CPAN</ref>). |
|||
Das bekannteste und grundlegendste Perl-Motto ist „There is more than one way to do it“(kurz '''TIMTOWTDI''' oder auch ''Tim Today''). Zu deutsch: „Es gibt mehr als einen Weg etwas zu tun“. Damit ist gemeint das Perl kaum Vorgaben macht sondern für jedes Problem |
|||
absichtlich mehrer Lösungen oder Ausdrucksmöglichkeitn anbietet. Zum Beispiel kann man logische Operatoren „||“ und „&&“ oder „or“ und „and“ bzeichnen, aber auch Befehle mit einem sich überschneidenden Funktionsumfang wie map und for erlauben verschiedene Formulierungen für den gleichen Sachverhalt. Die Freiheit dem persönlichen Programmierstil nachzugehen, ist für manche Programmiere ein wichtiger Grund 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 [[Programmierparadigma|Paradigmen]] vereint und es dem Benutzer freisteht, strukturierte, objektorientierte, funktionale und imperative Sprachmerkmale zu kombinieren. |
|||
==== Einfach und möglich ==== |
==== 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 <code>-e ''dateiname''</code> die Existenz einer Datei. Einfache Aufgaben einfach zu belassen bedeutet für Perl aber auch, möglichst keine vorbereitenden Programmieranweisungen zu verlangen, wie das Anmelden von Variablen oder das Schreiben einer Klasse. 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 ersten beiden Ziele nicht kollidieren zu lassen, gewinnt mit dem wachsenden 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. |
|||
Der andere wichtige Perl-Merksatz ist ''keep simple tasks simple, and make hard tasks possible'', was zu deutsch bedeutet ''Halte die einfachen Arbeiten einfach und mach (die Lösung der) schwere(n) Aufgaben möglich''. |
|||
==== |
==== Kontextsensitiv ==== |
||
In Perl gibt es Befehle, die verschiedene Bedeutungen haben, je nachdem |
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 (Mathematik)|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 ''[[Make]]files'' und der Test-Suite übernehmen. Typischerweise ist das kompilierte Programm circa 850 KB groß, was aber je nach Betriebssystem, verwendetem Compiler und Bibliotheken variieren kann. |
|||
Perls Eigenschaften werden oft so verstanden, dass sie dazu einladen, unübersichtlichen [[Quellcode]] zu schreiben, manche Kritiker behaupten sogar, Perl sei die einzige Sprache, in der man „write–only“ programmieren könne, dass also ein einmal geschriebenes Programm weder für andere zu verstehen sei, noch für den Autor, wenn er es nach Monaten liest. Tatsächlich bietet Perl einerseits 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 nah am menschlichen Verständnis zu programmieren, was zu einer sonst unerreichbaren Lesbarkeit führen kann. |
|||
Perl-Skripte werden in [[Textdatei]]en mit beliebigem Zeilentrennzeichen gespeichert. Beim Start eines Skripts wird es vom Perl-Interpreter eingelesen, in einen [[Abstract Syntax Tree|Parse Tree]] umgewandelt, dieser zu [[Bytecode]], welcher dann ausgeführt wird. |
|||
Weiterhin wird Perl vorgeworfen, dass es die UNIX-Philosophie verletzt. Siehe dazu den Abschnitt [[Perl#Praktisch|Praktisch]]. |
|||
Der im Interpreter integrierte Parser ist eine angepasste Version von [[GNU Bison]]. |
|||
Strenggenommen ist Perl daher keine interpretierte Sprache, da ein Perl-Programm vor jeder Ausführung [[Kompilierung|kompiliert]] wird. Das führt etwa dazu, dass – anders als bei rein interpretierten Sprachen – ein Programm mit [[Syntaxfehler]]n oder fehlenden Abhängigkeiten nicht startet. |
|||
=== Technische Merkmale === |
|||
=== Verbreitung === |
=== 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'' („Klebstoff-Sprache“), weil mit Hilfe von relativ schnell geschriebenen Perl-Skripten inkompatible Software verbunden werden kann. Bis heute gehört Perl auf allen [[Portable Operating System Interface|POSIX]]-kompatiblen und Unix-ähnlichen Systemen zur Grundausstattung. |
|||
Von Anfang an war Perl besonders auf die Verarbeitung von Texten und Textdateien sowie zur Ausgabe von Berichten ausgelegt. Durch zahlreiche Erweiterungen und zusätzliche Bibliotheken hat sich Perl jedoch längst zu einer auch universell einsetzbaren Sprache weiterentwickelt. [[Systemadministrator]]en und [[Webentwickler]] (siehe [[Common Gateway Interface|CGI]], [[HTML::Mason]]) setzen sie besonders gern ein. Ein weiteres Hauptanwendungsfeld ist das Data-[[Munging]], aber auch auf vielen anderen Gebieten ist Perl zu Hause – ausgenommen sind eigentlich nur Bereiche, in denen [[Skriptsprache]]n aus Geschwindigkeitsgründen ungeeignet sind. |
|||
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 [[Hypertext Markup Language|HTML]]-Seiten auszugeben. Der Perl-Interpreter wird dabei über [[Common Gateway Interface|CGI]] oder [[FastCGI]] vom Webserver angesprochen oder ist direkt im Server eingebettet. ([[mod_perl]] im [[Apache HTTP Server|Apache]], ''ActiveState PerlEx'' im [[Microsoft Internet Information Services|Microsoft 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]]'', ''[[Internet Movie Database|IMDb]].com'', ''[[slashdot]].org,'' ''[[Movable Type]]'', ''[[LiveJournal]]'' und ''[[Xing (soziales Netzwerk)|Xing]]'' 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 [[Framework]]s wie [[Mason (Perl)|Mason]], [[Catalyst Web Framework|Catalyst]], Jifty, [[Mojolicious]] und Dancer, die eine sehr schnelle Entwicklung komplexer und leicht veränderbarer Webseiten erlauben. Auch Wiki-Software ist häufig in Perl geschrieben wie z. B. Socialtext, welches auf Mason basiert, Kwiki, [[TWiki]], [[Foswiki]], [[ProWiki]] oder [[UseModWiki|UseMod]]. Auch verbreitete [[Trouble-Ticket-System|Ticket-Systeme]] mit [[Webschnittstelle]] wie [[Bugzilla]] oder [[Request Tracker|RT]] sind in Perl geschrieben. |
|||
=== Logos === |
|||
Als [[Maskottchen]] von Perl dient ein [[Dromedar]]. Es zierte erstmals den Umschlag des Referenzwerkes ''Programming Perl'', welches im [[O'Reilly Verlag]] herausgegeben wird und als das ''[[Kamel-Buch]]'' bekannt ist. In einem Interview sagte [[Tim O'Reilly]] 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. |
|||
Jedoch sind WWW-Anwendungen weiterhin nur eines der vielen Einsatzgebiete von Perl. Wichtige Perl-Programme im [[E-Mail]]-Bereich sind ''[[SpamAssassin]]'' ([[Spam]]-Filter), ''PopFile'' und ''open webmail''. Zur Systemverwaltung wird Perl zum Beispiel in [[debconf (Software)|debconf]], einem Teil der Paketverwaltung des Betriebssystems [[Debian]], benutzt. |
|||
== Syntax == |
|||
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 [[DNA-Sequenzanalyse|Genomsequenzenanalyse]] konzentriert. Beim [[Humangenomprojekt|Human Genome Project]] spielte Perl eine wichtige Rolle. |
|||
=== Freies Format === |
|||
Perl erlaubt freies Formatieren des Quellcodes. Das bedeutet, dass Einrückungen und zusätzliche Leerzeichen syntaktisch |
|||
unerheblich sind und auch Zeilenumbrüche nach Belieben eingefügt werden können. Logische Konsequenz dieser Freiheit ist die Notwendigkeit, jeden Befehl mit einem Semikolon abzuschliessen. |
|||
Auch [[Desktop (grafische Benutzeroberfläche)|Desktop]]-Anwendungen und Spiele wie ''[[Frozen Bubble]]'' können in Perl geschrieben werden. Die heutigen Computer sind schnell genug, diese Programme flüssig auszuführen. |
|||
=== Variablen === |
|||
Bereiche, in denen [[Skriptsprache]]n wie Perl nicht sinnvoll eingesetzt werden können, sind zum einen Anwendungen mit hohen Anforderungen an Hardware-Nähe oder Geschwindigkeit wie zum Beispiel [[Gerätetreiber|Treiber]] oder [[Codec]]s. Zum anderen sollten sie nicht in stark sicherheitskritischen Bereichen (z. B. Flugzeugsteuerung) Verwendung finden, da aufgrund der laxen Syntaxprüfung (z. B. fehlendes/sehr schwaches [[Typsystem]]) viele Fehler erst zur Laufzeit auftreten und eine [[Verifizierung#Informatik (Verifizieren von Software)|Verifizierung]] im Allgemeinen nicht möglich ist. |
|||
Charakteristisch für Perl ist, dass Variablen durch ein [[Prefix]] (auch ''[[Sigillenmagie|Sigil]]'' genannt) gekennzeichnet werden, das ihren Datentyp anzeigt. Hier einige Beispiele: |
|||
Perl-Portierungen existierten für über 100 Betriebssysteme.<ref>[http://cpan.perl.org/ports/ Liste der bekannten Ports] auf CPAN</ref> |
|||
$ für Skalare: $scalar |
|||
@ für Arrays: @array |
|||
% für Hashes/assoziative Arrays: %hash |
|||
& für Funktionen (oft optional): &function |
|||
* für Typeglobs: *all |
|||
=== Perl und andere Programmiersprachen === |
|||
Basisdatentypen in Perl sind [[skalare Variable]]n, [[Array]]s und [[Hash]]es ([[Assoziatives Array|assoziative Arrays]]). |
|||
Für Aufgaben, die mit Perl nur schwierig oder langsam lösbar sind, bietet Perl mit dem Modul Inline<ref>[http://metacpan.org/module/Inline Modul ''Inline'' auf CPAN]</ref> eine Schnittstelle an, über die Programmteile in anderen Sprachen in ein Perl-Programm eingebunden werden können. Unterstützte Sprachen sind u. a. [[C (Programmiersprache)|C]], [[C++]], [[Assemblersprache|Assembler]], [[Java (Programmiersprache)|Java]], [[Python (Programmiersprache)|Python]], [[Ruby (Programmiersprache)|Ruby]], [[Fortran]] und [[GNU Octave|Octave]].<ref>[http://www.gnu.org/software/octave/ GNU Octave] auf gnu.org</ref> |
|||
Anwendungsgebiete sind z. B.: |
|||
* Skalare sind typfreie Variablen für einzelne Werte, es können [[String]]s, Zahlen oder [[Referenz]]en auf andere Daten oder Funktionen in ihnen gespeichert sein. |
|||
* rechenintensive Formeln ([[C (Programmiersprache)|C]], [[Assemblersprache|Assembler]]), |
|||
* Arrays fassen mehrere Skalare unter einem Variablennamen zusammen. Arrayeinträge haben einen Index (die Zählung beginnt bei 0). |
|||
* Lösung komplexer Probleme mit existierenden Systemen ([[GNU Octave|Octave]], [[Fortran]]-[[Programmbibliothek|Bibliotheken]]) und |
|||
* zusammenführen von Anwendungen in unterschiedlichen Sprachen („Glue-Funktion“ von Perl). |
|||
Die Anwendung von Inline ist relativ einfach und gut dokumentiert. Bei kompilierten Programmteilen führt Inline mittels MD5-Kennung Buch über den Versionsstand, wodurch Mehrfachkompilierung des gleichen Codes vermieden wird. |
|||
* Hashes fassen ebenfalls Skalare zusammen, allerdings werden hier Einzelwerte (''Values'') nicht über numerische Indizes, sondern mit Hilfe zugehöriger ''Keys'' ([[alphanumerisch]]e Schlüssel) eindeutig identifiziert und angesprochen. |
|||
Bei Inline erfordert die Übergabe der Parameter und Rückgabe der Ergebnisse einigen Aufwand. Bei kurzen Berechnungen überwiegt dieser Aufwand den Gewinn an Geschwindigkeit. Wird zum Beispiel die [[Mandelbrot-Menge]] berechnet, indem die Formel <math>z \mapsto c+z^2</math> über Inline als [[C (Programmiersprache)|C]]-Funktion berechnet, die Iteration aber in Perl belassen, verlangsamt sich die Programmausführung gegenüber einer reinen Perl-Implementierung. Wird hingegen auch die Iterationsschleife in [[C (Programmiersprache)|C]] ausgelagert, steigert sich die Performance signifikant. |
|||
Hashes und Arrays lassen sich einander zuweisen, wobei Hashes als Listen von Key/Value-Paaren betrachtet werden. |
|||
Daten verschieden Typs lassen sich beliebig zu neuen Datenstrukturen kombinieren, beispielsweise sind Hashes denkbar, die neben Arrays auch einzelne Skalare enthalten. |
|||
=== Logos === |
|||
Package-Variablen werden automatisch erstellt, sobald sie das erstemal verwendet werden. |
|||
[[Datei:Tim O'Reilly 2005 Where 2.0 Conference1.jpg|mini|Tim O’Reilly zählte viele Jahre zu Perls wichtigsten Unterstützern. Sein Verlag hält die Rechte am vielleicht wichtigsten Perl-Logo: dem Kamel.]] |
|||
Als [[Maskottchen]] von Perl dient ein [[Dromedar]]. Es zierte erstmals den Umschlag des auch als ''[[#Literatur|Kamelbuch]]'' 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 [[ActivePerl]] von ActiveState schmückt. |
|||
== Syntax == |
|||
<code>undef(<variable>)</code> gibt die angegebene Variable wieder frei. |
|||
=== 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. Einige Sprachelemente wie Formate, [[heredoc]]s und gewöhnliche reguläre Ausdrücke sind nicht formatfrei. |
|||
=== Variablen === |
|||
Charakteristisch für Perl ist, dass Variablen durch ein [[Präfix]] (auch ''[[Sigillenmagie|Sigil]]'' genannt) gekennzeichnet werden, das ihren Datentyp anzeigt. Hier einige Beispiele: |
|||
* <code>$</code> für Skalare: <code>$scalar</code> |
|||
* <code>@</code> für Arrays: <code>@array</code> |
|||
* <code>%</code> für Hashes (assoziative Arrays): <code>%hash</code> |
|||
* <code>&</code> für Funktionen (oft optional): <code>&function</code> |
|||
* <code>*</code> für Typeglobs: <code>*all</code> |
|||
[[Datei-Handle]]s, Verzeichnis-Handles und Formate besitzen kein Präfix, sind aber ebenfalls eigenständige Datentypen. Jeder Datentyp hat in Perl seinen eigenen [[Namensraum]]. |
|||
Basisdatentypen in Perl sind [[skalare Variable]]n, [[Feld (Datentyp)|Arrays]] und [[Hashtabelle|Hashes]] ([[Assoziatives Datenfeld|assoziative Arrays]]). |
|||
* Skalare sind typlose Variablen für einzelne Werte; es können [[Zeichenkette|Strings]], Zahlen (Ganz/Gleitkomma) oder [[Referenz (Programmierung)|Referenzen]] auf andere Daten oder Funktionen in ihnen gespeichert sein. Strings und Zahlen werden bei Bedarf automatisch und transparent ineinander umgewandelt, eine große Besonderheit von Perl. |
|||
* Arrays fassen mehrere Skalare unter einem Variablennamen zusammen. Arrayeinträge haben einen Index. Die Zählung beginnt bei 0, wenn nichts anderes definiert wurde. |
|||
* 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 (Referenzen 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 <code>my</code> deklariert werden. <code>our</code> macht eine Variable im gesamten Programm verfügbar. <code>undef ''variable''</code> gibt die angegebene Variable wieder frei. |
|||
=== Kontrollstrukturen === |
=== Kontrollstrukturen === |
||
Die grundlegenden [[Kontrollstruktur]]en unterscheiden sich kaum von denen in [[ |
Die grundlegenden [[Kontrollstruktur]]en unterscheiden sich kaum von denen in C, [[Java (Programmiersprache)|Java]] und [[JavaScript]]. |
||
==== Bedingte Ausführung ==== |
==== Bedingte Ausführung ==== |
||
<code>if</code> funktioniert wie aus C bekannt |
<code>if</code> funktioniert wie aus C bekannt; <code>unless (<Bedingung>)</code>, eine Besonderheit von Perl, ist eine Schreibweise für <code>if (!(<Bedingung>))</code>. Eine Case- oder Switch-Anweisung (<code>given when</code>) gibt es erst ab Perl 5.10, vorher musste man diese Struktur mit <code style="white-space:nowrap">if … elsif … else</code> nachbilden. Jedoch setzt <code>given</code> die Kontextvariable (<code>$_</code>) wie <code>for</code> und <code>when</code> wendet smartmatch (<code>~~</code>) darauf an, was dieses Konstrukt ungleich vielfältiger einsetzbar macht als traditionelle Case-Befehle. Das optionale <code>default</code> entspricht hier einem <code>else</code>. Die optimierten logischen Operatoren erlauben auch eine bedingte Ausführung. Bei <code>or</code> (bzw. <code>||</code>) wird der zweite Ausdruck ausgeführt, wenn das Ergebnis des ersten kein wahrer Wert ist, <code>and</code> (bzw. <code>&&</code>) funktioniert analog. |
||
<syntaxhighlight lang="perl"> |
|||
if (<Bedingung>) {<Anweisungen>} |
|||
if (<Bedingung>) {<Anweisungen>} |
|||
[ |
[elsif (<Bedingung>) {<Anweisungen>}] |
||
[else {<Anweisungen>}] |
|||
unless (<Bedingung>) {<Anweisungen>} |
unless (<Bedingung>) {<Anweisungen>} |
||
[else |
[else {<Anweisungen>}] |
||
given (<variable>) { |
|||
<Bedingung> ? <Anweisung 1> : <Anweisung 2>; |
|||
[when (<Wert>) {<Anweisungen>}] |
|||
[default {<Anweisungen>}] |
|||
<Ausdruck 1> || <Ausdruck 2>; |
|||
} |
|||
<Ausdruck 1> && <Ausdruck 2>; |
|||
<Bedingung> ? <Anweisung1> : <Anweisung2>; |
|||
<Ausdruck1> || <Ausdruck2>; |
|||
<Ausdruck1> && <Ausdruck2>; |
|||
</syntaxhighlight> |
|||
==== Schleifen ==== |
==== Schleifen ==== |
||
Wie in C iterieren <code>while</code> und <code>for</code> (in |
Wie in C [[iterieren]] <code>while</code> und <code>for</code> (in der an C angelehnten Variante), solange die Bedingung wahr ist, <code>until</code>, bis sie wahr ist, und <code>foreach</code> iteriert über eine Liste. In Perl 5 sind <code>for</code> und <code>foreach</code> austauschbar. |
||
<syntaxhighlight lang="perl"> |
|||
[label:] while (<Bedingung>) {<Anweisungen>} [continue {<Anweisungen>}] |
|||
[label:] |
[label:] while (<Bedingung>) |
||
{<Anweisungen>} [continue {<Anweisungen>}] |
|||
[label:] until (<Bedingung>) |
|||
{<Anweisungen>} [continue {<Anweisungen>}] |
|||
[label:] for ([<Startanweisung>]; [<Bedingung>]; [<Updateanweisung>]) |
[label:] for ([<Startanweisung>]; [<Bedingung>]; [<Updateanweisung>]) |
||
{ |
{<Anweisungen>} [continue {<Anweisungen>}] |
||
[label:] foreach [ [my] $element] (<liste>) {<Anweisungen>} |
|||
[ continue {<Anweisungen>} ] |
|||
[label:] for[each] [[my] $element] (<Liste>) |
|||
<code>goto</code> springt ungeachtet der Verschachtelung zu einer Schleife die mit genanntem Label beginnt, |
|||
{<Anweisungen>} [continue {<Anweisungen>}] |
|||
<code>last</code> verläßt sofort die Schleife, <code>next</code> springt sofort zur nächsten [[Iteration]] und <code>redo</code> springt zum <code>continue</code>-Block und wiederhohlt danach die derzeitige Iteration. |
|||
</syntaxhighlight> |
|||
do {<Anweisungen>} while <Bedingung>; # Spezialfall: in dieser Form |
|||
do {<Anweisungen>} until <Bedingung>; # mindestens eine Ausführung |
|||
<code>last</code> verlässt sofort die Schleife, <code>redo</code> wiederholt die derzeitige Iteration, und <code>next</code> springt zum <code>continue</code>-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. |
|||
<syntaxhighlight lang="perl"> |
|||
do {<Anweisungen>} while <Bedingung>; # Spezialfall: in dieser Form |
|||
do {<Anweisungen>} until <Bedingung>; # mindestens eine Ausführung |
|||
</syntaxhighlight> |
|||
==== Nachgestellte Kontrollstrukturen ==== |
==== Nachgestellte Kontrollstrukturen ==== |
||
Die oberhalb aufgezählten |
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. |
||
<syntaxhighlight lang="perl"> |
|||
<Anweisung> if <Bedingung>; |
|||
<Anweisung> |
<Anweisung> if <Bedingung>; |
||
<Anweisung> unless <Bedingung>; |
|||
<Anweisung> while <Bedingung>; |
|||
<Anweisung> until <Bedingung>; |
|||
<Anweisung> for <Liste>; |
|||
<Anweisung> for <Liste>; |
|||
=== Dokumentation === |
|||
<Anweisung> while <Bedingung>; |
|||
* [[Plain Old Documentation]] (POD) ist die Beschreibungssprache für die Dokumentation von Perlprogrammen. |
|||
<Anweisung> until <Bedingung>; |
|||
<!-- |
|||
</syntaxhighlight> |
|||
== Beispiele == |
|||
Perl wird häufig für so genannte Filterprogramme verwendet. |
|||
Diese lesen Zeile für Zeile von der Standard-Eingabe-Datei, bearbeiten sie und schreiben das Ergebnis auf die Standard-Ausgabe-Datei. |
|||
=== Reguläre Ausdrücke === |
|||
Ein erster Entwurf könnte beispielsweise so aussehen: |
|||
Seit seinen Anfängen waren [[Regulärer Ausdruck|reguläre Ausdrücke]] (Regex) ein besonderes Merkmal von Perl, da ähnliche Fähigkeiten bis dahin meist nur spezialisierte Sprachen wie [[SNOBOL|Snobol]] und [[awk]] hatten. Durch die große Verbreitung setzte Perl einen inoffiziellen Standard, der durch die von Perl unabhängige und auch teilweise abweichende Bibliothek [[Perl Compatible Regular Expressions|PCRE]] aufgegriffen wurde, die heute von mehreren bedeutenden Sprachen und Projekten verwendet wird. |
|||
Ab Version 5.0 hat Perl seine Regex-Fähigkeiten um viele Funktionen, wie z. B. Rückwärtsreferenzen, erweitert. Auch lassen sich reguläre Ausdrücke in Perl wesentlich direkter – als z. B. in Java – mit dem <code>=~</code>-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 Schrägstriche häufig 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. |
|||
while ($line = <STDIN>) { |
|||
# bearbeite hier den Inhalt der Variable $line |
|||
... |
|||
# ... und gib das Ergebnis aus |
|||
print $line; |
|||
} |
|||
Perl kennt zwei Befehle für reguläre Ausdrücke, deren Verhalten mit vielen nachgestellten Optionen verändert werden kann. |
|||
Weil diese Art Aufgabe in Perl häufig vorkommt, gibt es dafür eine Abkürzung – das typische [[Idiom]] arbeitet implizit mit der Variablen $_. Hier ein Beispiel das alle eingelesenen Zeilen um einen <Tab> eingerückt ausgibt: |
|||
* Der <code>m</code>-Befehl steht für ''match'', was Übereinstimmung bedeutet. Das <code>m</code> 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 <code>$var</code> und liefert einen Array von Zeichenketten, auf die der Suchausdruck passt. Mit aktivierter <code>g</code>-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 <code>c</code>-Option die Anzahl der Funde. <code>i</code> lässt Groß- und Kleinschreibung ignorieren, <code>o</code> Variablen nur einmal interpolieren, <code>m</code> den String als mehrzeilig und <code>s</code> als einzeilig betrachten. Die <code>x</code>-Option ermöglicht es, den Suchausdruck der besseren Lesbarkeit wegen über mehrere Zeilen zu verteilen und ihn mit Kommentaren zu versehen. |
|||
<syntaxhighlight lang="perl"> |
|||
while (<>) { |
|||
$var =~ [m]/<Suchausdruck>/[g[c]][i][m][o][s][x]; |
|||
# Die eingelesene Zeile steht in $_ |
|||
</syntaxhighlight> |
|||
# Wir schieben ein <Tab> vor die Zeile |
|||
# und geben diese aus. |
|||
print "\t" . $_; |
|||
} |
|||
* Der <code>s</code>-Befehl steht für ''substitute'', was ersetzen bedeutet. Er ersetzt den Teil des gegebenen Textes, auf den der Suchausdruck passt mit dem Ersatzausdruck. |
|||
Anderes Beispiel: Einlesen einer Datei in ein Array von Zeilen. Dieses Beispiel ist aber speichertechnisch ineffizient, und sollte nur bei kleineren Dateien verwendet werden. |
|||
<syntaxhighlight lang="perl"> |
|||
@meinArray = <STDIN>; |
|||
$var =~ s/<Suchausdruck>/<Ersatzausdruck>/[e][g][i][m][o][s][x]; |
|||
</syntaxhighlight> |
|||
Nach erfolgreicher Verwendung eines regulären Ausdruckes stehen folgende Sondervariablen zur Verfügung: |
|||
Noch ein Beispiel: Zählen von Wörtern und nach Häufigkeit (seltenste zuerst) ausgeben |
|||
* <code>$&</code> – der erkannte String |
|||
* <code>$`</code> – String vor dem erkannten String |
|||
* <code>$'</code> – String nach dem erkannten String |
|||
* <code>$1</code>..<code>$n</code> – Ergebnisse der geklammerten Subausdrücke |
|||
* <code>$+</code> – der letzte erkannte Subausdruck |
|||
* <code>@-</code> – Start-Offsets der Treffer und Subtreffer |
|||
* <code>@+</code> – dazugehörige End-Offsets |
|||
Der oft in einem Atemzug mit <code>m//</code> und <code>s///</code> beschriebene Operator <code>tr///</code> hat mit ihnen nur die Schreibweise gemein. Er lehnt sich an den UNIX-Befehl <code>tr</code> an, der dem Ersetzen einzelner Zeichen dient. Synonym kann statt <code>tr</code> auch <code>y</code> geschrieben werden. |
|||
ausführliche Version: |
|||
<syntaxhighlight lang="perl"> |
|||
while ($zeile=<ARGV>) { |
|||
$var =~ tr/<Suchzeichen>/<Ersatzzeichen>/[c][d][s]; |
|||
@worte = split /\s+/, $zeile; |
|||
</syntaxhighlight> |
|||
foreach $wort (@worte) |
|||
{$haeufigkeit{$wort}++;} |
|||
} |
|||
foreach $wort (reverse sort {$haeufigkeit{$a} <=> $haeufigkeit{$b}} keys %haeufigkeit) { |
|||
print "$wort: $haeufigkeit{$wort}\n"; |
|||
} |
|||
Neben diesen beiden kann auch der Befehl <code>split</code> erwähnt werden, der eine Zeichenfolge aufteilt anhand eines Trennzeichens, das auch ein regulärer Ausdruck sein darf. |
|||
kurze Version: |
|||
map {$_{$_}++} split while <>; |
|||
print "$_: $_{$_}\n" for reverse sort {$_{$a} <=> $_{$b}} keys %_; |
|||
=== Quoting und Interpolation === |
|||
(Man beachte hierbei, dass der Skalar <code>$_</code> und der Hash <code>%_</code>, auf dessen Elemente mit <code>$_{schlüssel}</code> zugegriffen wird, unterschiedliche Variablen sind!)--> |
|||
Quoting-Operatoren: |
|||
* <code>q</code> – quote nicht interpretierter String (alias zu ' ') |
|||
* <code>qq</code> – quote interpretierter String (alias zu " ") |
|||
* <code>qw</code> – quote words, eine Liste von mit [[Leerraum|Whitespace (Leerraum)]] getrennten Strings |
|||
* <code>qr</code> – quote oder kompiliere regex |
|||
* <code>qx</code> – quote auszuführende externe Anwendung (basierend auf Perls <code>readpipe</code>) |
|||
Alternatives Quoting und Variableninterpolation führen zu besonders gut lesbarem Code. Ein Beispiel zur Verdeutlichung: |
|||
== Spaß mit Perl == |
|||
* Stringverkettung und Quotingzeichen im Text machen den Code schlecht lesbar. |
|||
Viele Spracheigenschaften von Perl laden dazu ein, [[Quelltext|Programmcode]] kreativ zu gestalten. Dies hat zu verschiedenen intellektuellen, teils humorvollen, teils skurrilen Wettbewerben und Traditionen um die Programmiersprache Perl geführt. |
|||
<syntaxhighlight lang="perl"> |
|||
$text = 'He\'s my friend ' . $name . ' from ' . $town . '.' |
|||
. ' ' . $name . ' has worked in company "' . $company . '" for ' . $years . ' years.'; |
|||
</syntaxhighlight> |
|||
* Interpolation von Variablen im String machen das Ergebnis jetzt erkennbar. Escapes \ stören noch den Textfluss. |
|||
<syntaxhighlight lang="perl"> |
|||
$text = "He's my friend $name from $town. $name has worked in company \"$company\" for $years years."; |
|||
</syntaxhighlight> |
|||
* Austausch des Quotingzeichens macht Escapes überflüssig. Der Code ist nun optimal. <code>qq</code> leitet das Quoting von Variablen im String ein. Das beliebige Zeichen danach ist das Quotingzeichen für diesen String. |
|||
<syntaxhighlight lang="perl"> |
|||
$text = qq{He's my friend $name from $town. $name has worked in company "$company" for $years years.}; |
|||
</syntaxhighlight> |
|||
== Kritik == |
|||
Häufigster Kritikpunkt an Perl ist, dass darin geschriebene Programme schlecht lesbar seien. Zudem bietet Perl überdurchschnittlich viele Freiheiten, die zu unleserlichem Code führen können ''(siehe [[#Disziplinen|Disziplinen]])''. Andererseits ermöglicht die gleiche Freiheit es auch, nahe an der logischen Struktur des Problems oder dem menschlichen Verständnis zu programmieren. Die von Perl-Programmierern geschätzte Freiheit, persönlichen Vorlieben nachzugehen, muss bei Projekten, die von mehreren Programmierern oder über längere Zeiträume entwickelt werden, durch selbst auferlegte Regeln eingeschränkt werden, um spätere Probleme zu vermeiden. Dies erfordert zusätzlichen Kommunikationsaufwand oder die Verwendung von statischen [[Lint (Programmierwerkzeug)|Code-Analyse-Tools]] wie ''Perl::Critic''. |
|||
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. |
|||
Einige Teile der Syntax, wie der Ausdruck der Objektorientierung und [[Signatur (Programmierung)|Signaturen]], sind zwar einfach und sehr mächtig, werden aber häufig gegenüber vergleichbaren Sprachen wie [[Python (Programmiersprache)|Python]] oder [[Ruby (Programmiersprache)|Ruby]] als veraltet wahrgenommen und fordern bei standardisierten Herangehensweisen besonders von Perl-Anfängern zusätzliche Tipp- und Denkarbeit. Mit zusätzlichen Modulen lassen sich viele der Schwierigkeiten minimieren. So gibt es mit ''English'' ein Core-Modul, das den Spezialvariablen aussagekräftigere Namen gibt und mit ''Moose'' ein sehr modernes und umfangreiches Objektsystem, das sich stark an das von Raku anlehnt. Es gilt heute als De-facto-Standard für objektorientierte Programmierung mit Perl.<ref>[http://www.modernperlbooks.com/mt/2011/03/why-modern-perl-teaches-oo-with-moose.html ''Why Modern Perl Teaches OO with Moose''.] chromatic</ref> Signaturen wurden mit 5.20 eingeführt, sind aber immer noch als experimentell eingestuft. |
|||
=== Poesie === |
|||
Eine anderer Wettbewerb prämiert die besten Beispiele in Perl-[[Poesie]], die in 2 Kategorien betrieben wird. 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. Da Perl viele Elemente der englischen Sprache beinhaltet, ist dies durchaus möglich, so erscheinen zum Beispiel regelmäßig neue Gedichte in der [http://www.perlmonks.org/index.pl?node=Perl%20Poetry Perl Poetry]-Kategorie des englischsprachigen ''Perl Monks''-Forums. Daneben gibt es auch noch einen Perl - [[Haiku]] Wettbewerb, der dieser japanischen Gedichtform gewidmet ist. |
|||
Weiterhin wurde Perl vorgeworfen, es verletze die UNIX-Philosophie. Siehe dazu den Abschnitt [[#Entstehung|Entstehung]]. |
|||
=== Obfuscation === |
|||
Sehr berühmt und berüchtigt ist auch die Disziplin ''obfuscation'', für die es auch einen jährlichen Wettbewerb gibt, der am ehesten mit dem ''International Obfuscated C Code Contest'' vergleichbar ist, den Larry 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. |
|||
Kritik wurde auch gegen Raku erhoben, das zu hoch gesteckte Ziele habe und nach vielen Jahren keine sichtbaren Ergebnisse bringe, stattdessen die Zukunft von Perl lähme. Raku war von Anfang an als Langzeitprojekt ausgerufen, das ausschließlich auf nicht immer planbarer Freiwilligenarbeit und kaum finanzieller Unterstützung beruht. Seine konkreten Ziele zeichneten sich erst im Verlauf der Entwicklung ab, und es gab eindeutige Probleme bei der Kommunikation und der Außendarstellung. Allerdings stammen seit Perl 5.10 wesentliche Neuerungen aus der Schwestersprache. |
|||
=== JAPH === |
|||
Eine Art Unterkategorie von ''obfuscation'' sind die von ''Merlin'' Randal L. Schwartz begründeten Disziplin: [[Just another Perl hacker|JAPH]]. Das sind [[Signature]]n, die kleine Perl-Programme enthalten, welche meist nur den Namen des Autoren oder eine Botschaft auf eine möglichst nicht nachvollziehbare Art ausgeben. Die Buchstaben JAPH sind die Anfangsbuchstaben von ''Merlins'' Signatur ''Just Another Perl Hacker''. |
|||
== Perl-Kultur und Spaß == |
|||
=== Gemeinschaft === |
|||
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. Von Variablen bis Referenzen und mehrdimensionalen Arrays ist alles in dieser neuen Sprachdefinition vorhanden. Nahezu alle Sonderzeichen wurden aus der Sprache entfernt, Variablen gleicher Namen, aber unterschiedlicher Struktur (Beispielsweise ''$next'' und ''@next'') werden dekliniert, um die entsprechende Variable zu adressieren. Etwas Beispielcode: |
|||
[[Datei:TPF logo.png|mini|Logo der Perl Foundation]] |
|||
insertum stringo unum tum duo excerpemento da. |
|||
Wie auch bei anderen Projekten freier Software gibt es zwischen vielen Entwicklern und Benutzern der Sprache besondere soziale Bindungen, und es bildete sich eine eigene Kultur daraus. Die Perl-Kultur ist von Offenheit, [[Gastlichkeit]] und Hilfsbereitschaft, aber auch von [[Individualismus]], Spieltrieb und Humor geprägt. 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 mittlerweile 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 und die gespendeten Gelder für einflussreiche Projekte und Personen, Organisation von Entwicklerkonferenzen und den Betrieb der wichtigsten Perl betreffenden Webseiten verwendet. |
|||
# Entspricht: substr($string,1,2) = $insert; |
|||
clavis hashus nominamentum da. |
|||
# Entspricht: @keys = keys %hash; |
|||
Aus ähnlichem Antrieb entstanden „Sprach-Module“ für [[Völker im Star-Trek-Universum#Klingonen|klingon]]isch, 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. |
|||
=== Treffen, Workshops und Konferenzen === |
|||
=== Acme === |
|||
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''<ref name="Perl-Workshop">[https://act.yapc.eu/gpw2020/ ''22nd German Perl/Raku Workshop 2020 in Erlangen''.]</ref> der erste war. Workshops wollen ambitionierte Entwickler in einem möglichst erschwinglichen Rahmen lokal zusammenführen. Ein ähnliches Ziel haben die größeren ''Yet Another Perl Conferences'' (YAPC), die für die Regionen Nordamerika, Brasilien, Europa, Asien, Russland und Israel abgehalten werden. Am größten, allerdings auch am teuersten ist die von [[O’Reilly Verlag|O’Reilly]] in den USA ausgerichtete ''The Perl Conference'' (''TPC''), die mittlerweile Teil der [[OSCON]] ist. |
|||
[[Brian Ingerson]] legte mit seinem bekanntem Modul namens Acme, das 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 [[George_W._Bush|Präsidenten Bush]] versehen oder Methoden zufällig löschen, was die Anwesenheit einer diebischen [[Elster]] simulieren soll. |
|||
Seit etwa 2005 werden für engagierte Beitragende auch [[Hackathon]]s abgehalten. |
|||
=== Mottos und Zitate === |
|||
Es gibt viele bekannte Mottos und Zitate, die sich mit Perl selbst oder den Möglichkeiten der Sprache beschäftigten, hier einige Kostproben. |
|||
* ''Perl: the Swiss Army Chainsaw of Programming Languages.'' |
|||
* ''There's more than one way to do it'' (Timtowtdi) |
|||
* ''... we often joke that a camel is a horse designed by a committee, but if you think about it, the camel is pretty well adapted for life in the desert. The camel has evolved to be relatively self-sufficient. On the other hand, the camel has not evolved to smell good. Neither has Perl.'' ([[Larry Wall]] über das Kamel als Perl-Maskottchen) |
|||
=== Disziplinen === |
|||
== Weitere Informationen== |
|||
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 |
|||
=== Literatur === |
|||
: [[Codegolf|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. |
|||
* [[Larry Wall]] u. A.: ''Programmieren in Perl'', [[O'Reilly Verlag]], ISBN 3897211440 (das ''Kamel-Buch'') |
|||
; Poesie |
|||
* Randal L. Schwartz, Tom Christiansen: ''Einführung in Perl'', O’Reilly, ISBN 3897211475 (das ''Lama-Buch'') |
|||
: Da Perl viele Elemente der englischen Sprache beinhaltet, gibt es regelrechte Wettbewerbe, in welchen die besten Beispiele für ''Perl-[[Digitale Poesie|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.<ref>zum Beispiel [http://www.perlmonks.org/index.pl?node=Perl%20Poetry Perl-Poetry-Kategorie] perlmonks.org (englisch)</ref> Daneben gibt es auch noch einen Perl-[[Haiku]]-Wettbewerb, der dieser japanischen Gedichtform gewidmet ist. |
|||
* Michael Schilli: ''GoTo Perl 5'', Addison-Wesley, 1998, ISBN 3827313783 (deutsch) |
|||
; Obfuscation |
|||
* Johan Vromans: ''Perl 5, kurz und gut'', O'Reilly Verlag 2000, ISBN 3897212277 (Kurzreferenz) |
|||
: Sehr berühmt und berüchtigt ist auch die Disziplin ''obfuscation'' (Verschleierung), 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 5. ''Annual Obfuscated Perl Contest'' den zweiten Preis gewann (dieses Programm gibt den Text „Just another Perl / Unix hacker“ aus): |
|||
* Joseph N. Hall, Randal L. Schwartz: ''Effective Perl Programming'', Addison-Wesley Professional, ISBN 0201419750 |
|||
@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{ |
|||
* Damian Conway: ''Object Oriented Perl'', [[Manning]] 2000, ISBN 1884777791 |
|||
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord |
|||
**(in schlechter Übersetzung) deutsch bei [[Addison-Wesley]] 2001: ''Objektorientiert Programmieren mit Perl'', ISBN 3827318122 |
|||
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&& |
|||
* Mark Jason Dominus: ''Higher Order Perl'', Morgan Kaufmann, ISBN 1558607013 |
|||
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print |
|||
* Randall, Sugalski, Tötsch: ''Perl 6 & Parrot Essentials'', O’Reilly 2004, ISBN 059600737X |
|||
[[Datei:randal l. schwartz.jpg|mini|Randal L. Schwartz]] |
|||
=== Konferenzen und Workshops === |
|||
; JAPH |
|||
''The Perl Conference'' ist ein großes, von O’Reilly ausgerichtetes, allerdings auch teures Treffen in Amerika. [[YAPC (Yet Another Perl Conference) | YAPCs (''Yet Another Perl Conferences'')]] versuchen, Entwickler in einem möglichst erschwinglichen Rahmen lokal zusammenzuführen, und haben inzwischen beispielsweise in Amerika, Europa und Israel Tradition. ''Der [http://www.perl-workshop.de/ Deutsche Perl-Workshop]'' als Treffen für den deutschsprachigen Raum etablierte sich bereits vor den YAPCs mit ähnlichen Zielen und findet in Zusammenarbeit mit ihnen jährlich statt. Inzwischen werden auch in vielen anderen Ländern Workshops organisiert. |
|||
: Eine Art Unterkategorie von ''obfuscation'' ist die von [[Randal L. Schwartz]] öffentlich begonnene Disziplin [[Just another Perl hacker|JAPH]]. Das sind [[Signatur (E-Mails und Postings)|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 [[Klingonische Sprache|Klingonisch]], [[Völker im Star-Trek-Universum#Borg|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 [[Bushism|typischen Sprachfehlern]] des [[George W. Bush|Präsidenten Bush]] versehen oder Methoden zufällig löschen, was die Anwesenheit einer diebischen [[Elster]] simulieren soll. |
|||
=== |
=== Mottos und Zitate === |
||
[[Datei:Drei mongolische kamele.JPG|mini|Perl-Programmierer sehen Kamele jeder Art als Maskottchen. Die London Perl Mongers haben sogar eines aus dem Londoner Zoo adoptiert.]] |
|||
* Am 9. und 10. Juni 2005 findet in Wien der 2. [http://conferences.yapceurope.org/apw2005/ österreichische Perl Workshop] statt. |
|||
Es gibt viele bekannte Mottos und Zitate, die sich mit Perl selbst oder den Möglichkeiten der Sprache beschäftigen; hier einige Kostproben: |
|||
* Der [http://www.perl-workshop.de/2006/ 8. deutsche Perl-Workshop] findet vom Mittwoch, 1. März 2006 (Aschermittwoch) bis Freitag, 3. März 2006 in Bochum statt. Dieser ist an professionelle Perl-Entwickler gerichtet, welche bereits an größeren Perl-Projekten beteiligt waren. |
|||
* {{" |lang=en |Text=''Perl: the Swiss Army Chainsaw of Programming Languages.''}}<br />(Perl: Die Schweizer Armee-Kettensäge der Programmiersprachen. Anspielung auf die Vielseitigkeit von [[Schweizer Taschenmesser]]n.) |
|||
* {{" |lang=en |Text=''Perl is the only language that looks the same before and after RSA encryption.'' |Autor=Keith Bostic}}<br />(Perl ist die einzige Sprache, die vor und nach einer [[RSA-Kryptosystem|RSA]]-Verschlüsselung gleich aussieht.) |
|||
* {{" |lang=en |Text=''Only perl can parse Perl.'' |Autor=Larry Wall}}<br />(Nur perl kann Perl [[Parser|parsen]].) |
|||
* {{" |lang=en |Text=''… we often joke that a camel is a horse designed by a committee, but if you think about it, the camel is pretty well adapted for life in the desert. The camel has evolved to be relatively self-sufficient. On the other hand, the camel has not evolved to smell good. Neither has Perl.'' |Autor=Larry Wall |Quelle=über das Kamel als Perl-Maskottchen}}<br />(… 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.) |
|||
* {{" |lang=en |Text=''The very fact that it’s possible to write messy programs in Perl is also what makes it possible to write programs that are cleaner in Perl than they could ever be in a language that attempts to enforce cleanliness'' |Autor=Larry Wall |Quelle=Linux World, 1999}}<br />(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.) |
|||
* {{" |lang=en |Text=''Perl: Write once – never understand again''}}<br />(Perl: Einmal schreiben – nie wieder verstehen. Eine Anspielung auf das Mantra ''Write once – run everywhere'' von [[Java (Programmiersprache)|Java]]) |
|||
== Auszeichnungen == |
|||
Wettbewerbe |
|||
{{Wikibooks1|Perl-Programmierung}} |
|||
* Im Jahr 2004 erreichte Perl beim 7. Wettbewerb des [[International Conference on Functional Programming Contest]] eine Platzierung in der Lightning Division und gewann 2007 den zweiten Platz. |
|||
{{Wikibooks2|Perldoc|Perl-Dokumentation}} |
|||
== Literatur == |
|||
==== Allgemeine Informationen==== |
|||
* Tom Christiansen, brian d foy, Larry Wall: ''Programming Perl.'' 4. Auflage. O’Reilly, Sebastopol CA, 2012, ISBN 978-0-596-00492-7 |
|||
* http://www.perl.org/ – Offizielle Homepage von Perl |
|||
* Randal L. Schwartz, brian d foy, Tom Phoenix: ''Learning Perl.'' 7. Auflage. O’Reilly, Sebastopol CA, 2017, ISBN 978-1-4919-5432-4. |
|||
* http://www.cpan.org/ – [[CPAN]] – Perlmodularchiv |
|||
* Randal L. Schwartz, brian d foy, Tom Phoenix: ''Intermediate Perl.'' 2. Auflage. O’Reilly, Sebastopol, CA, 2012, ISBN 978-1-4493-9309-0. |
|||
* http://www.activestate.com/ – Perl vorkompiliert für Windows und ein ''Cookbook''-Archiv mit von Benutzern beigesteuerten „Kochrezepten“ |
|||
* brian d foy: ''Mastering Perl.'' 2. Auflage. O’Reilly, Sebastopol CA, 2014, ISBN 978-1-4493-9311-3. |
|||
* http://history.perl.org/PerlTimeline.html – Perl-Zeitlinie |
|||
* Joseph N. Hall, brian d foy, Joshua A. McAdams: ''Effective Perl Programming.'' 2. Auflage. Addison-Wesley, Boston MA, 2010, ISBN 978-0-321-49694-2. |
|||
* http://www.theperlreview.com/ - Perl-Online-Journal |
|||
* chromatic: [http://modernperlbooks.com/books/modern_perl_2016/ ''Modern Perl''], Onyx Neon Press 2011, ISBN 0-9779201-7-8. (aktuellere Referenz, als E-Book frei erhältlich) |
|||
* http://perlcast.com/ - Perl-Nachrichten in Audioformat |
|||
* Damian Conway: ''Perl Best Practices.'' O’Reilly, Sebastopol CA, 2005, ISBN 978-0-596-00173-5. |
|||
* Damian Conway: ''Object Oriented Perl.'' Manning Publications, Greenwich CT, 2000, ISBN 1-884777-79-1. |
|||
* Peteris Krumins: ''Perl One-liners.'' No Starch Press, San Francisco CA, 2014, ISBN 978-1-59327-520-4. |
|||
* Johan Vromans: ''Perl Pocket Reference.'' 5. Auflage. O’Reilly, Sebastopol CA, 2011, ISBN 978-1-4493-0370-9 |
|||
* Jon Orwant (Hrsg.): ''Games, Diversions & Perl Culture.'' O’Reilly, Sebastopol CA, 2010, ISBN 978-0-596-00312-8. |
|||
* Jürgen Schröter: ''Grundwissen Perl'', Oldenbourg 2007, ISBN 978-3-486-58074-7. |
|||
* Mark Jason Dominus: [https://hop.perl.plover.com/book/ ''Higher-Order Perl''.] Morgan Kaufmann, 2005, ISBN 1-55860-701-3 ''([[Funktionale Programmiersprache#Funktionen höherer Ordnung|Funktionale Programmierung]] in Perl)'' |
|||
== Weblinks == |
|||
{{Wikibooks|Perl-Programmierung}} |
|||
* http://perldoc.perl.org/ – Die Online-Version der Perl-Dokumentation |
|||
{{Commonscat|Perl (programming language)|Perl (Programmiersprache)}} |
|||
* http://perl-seiten.privat.t-online.de/ – Gutes deutsches Perl-Tutorial für Einsteiger |
|||
* [https://www.perl.org/ perl.org] – Offizielle, sehr umfangreiche Website von Perl (allgemeine Informationen; englisch) |
|||
* http://www.uni-essen.de/~hrz030/perl/ – Sehr kompakte Perl-Einführung mit vielen kurzen Beispielcodestücken |
|||
* [https://www.perl.com/ perl.com] (englisch) |
|||
* [https://www.perlmonks.org/ PerlMonks Community] (englisch) |
|||
* [https://perldoc.pl/ Perldoc Browser] (englisch) |
|||
* [http://perl-seiten.privat.t-online.de/ Deutsches Perl-Tutorial für Einsteiger] |
|||
* [http://www.mathe2.uni-bayreuth.de/perl/inhalt.htm Deutsches Perl-Tutorial für Einsteiger und Fortgeschrittene] |
|||
== Einzelnachweise == |
|||
<references /> |
|||
* http://www.perlmonks.org/ – Internationales Internetforum der Perl-Benutzer |
|||
* http://www.perl-community.de/ – Forum deutscher Perl-Benutzer |
|||
* http://www.perl.de/ – Deutschsprachiges Perl-Forum |
|||
* http://www.perlunity.de/ – Deutschsprachige Perl-Community |
|||
* http://pm.org – Perl Mongers – lokale Benutzergruppen |
|||
{{Lesenswert|26. August 2005|8817148}} |
|||
{{Normdaten|TYP=s|GND=4307836-9}} |
|||
[[Kategorie:Programmiersprache]] |
|||
[[Kategorie:Skriptsprache]] |
|||
[[Kategorie:Programmiersprache Perl]] |
|||
[[ |
[[Kategorie:Perl (Programmiersprache)| ]] |
||
[[Kategorie:Freies Programmierwerkzeug]] |
|||
[[da:Perl]] |
|||
[[Kategorie:Skriptsprache]] |
|||
[[en:Perl]] |
|||
[[Kategorie:Imperative Programmiersprache]] |
|||
[[eo:Perl (programlingvo)]] |
|||
[[es:Perl]] |
|||
[[et:Perl]] |
|||
[[fi:Perl]] |
|||
[[fr:Perl (langage)]] |
|||
[[hr:Perl]] |
|||
[[id:Perl]] |
|||
[[it:Perl]] |
|||
[[ja:Perl]] |
|||
[[ko:펄]] |
|||
[[lb:Perl]] |
|||
[[lt:Perl]] |
|||
[[nl:Perl]] |
|||
[[no:Perl]] |
|||
[[pl:Perl]] |
|||
[[pt:Perl]] |
|||
[[ru:Перл (язык программирования)]] |
|||
[[sr:Perl]] |
|||
[[sv:Perl]] |
|||
[[tr:Perl]] |
|||
[[zh:Perl]] |
Aktuelle Version vom 7. Mai 2025, 11:17 Uhr
Perl | |
---|---|
![]() | |
Basisdaten | |
Paradigmen: | prozedural, modular, objektorientiert (seit Perl 5) |
Erscheinungsjahr: | 1987 |
Designer: | Larry Wall |
Entwickler: | Larry Wall, Perl Porter |
Aktuelle Version | 5.40.2[1] (13. April 2025) |
Typisierung: | schwach, dynamisch, implizit |
Beeinflusst von: | awk, BASIC-PLUS[2], C/C++, Lisp, Pascal, Python,[3]Raku,[4] sed, Smalltalk, Unix-Shell |
Beeinflusste: | PHP, Ruby, Python, JavaScript, Windows PowerShell |
Betriebssystem: | plattformunabhängig |
Lizenz: | GPL und Artistic License |
www.perl.org |
Perl [freie, plattformunabhängige und interpretierte Programmiersprache, die mehrere Paradigmen unterstützt.
] ist eineDer Linguist Larry Wall entwarf sie 1987 als Synthese aus C, awk, den Unix-Befehlen und anderen Einflüssen. Ursprünglich als Werkzeug zur Verarbeitung und Manipulation von Textdateien insbesondere bei der System- und Netzwerkadministration vorgesehen (zum Beispiel für die Auswertung von Logdateien), hat Perl auch bei der Entwicklung von Webanwendungen und in der Bioinformatik weite Verbreitung gefunden. Traditionell vertreten ist Perl auch in der Finanzwelt, vor allem bei der Verarbeitung von Datenströmen verschiedenartiger Nachrichtenquellen. 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 ein großer Gestaltungsspielraum sind Stärken der Sprache. Perl zählt zu den Allzweck-Programmiersprachen.
Geschichte
[Bearbeiten | Quelltext bearbeiten]Entstehung
[Bearbeiten | Quelltext bearbeiten]
Larry Wall war als Administrator und Programmierer bei dem Unternehmen Unisys angestellt, wo 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 Überwachung und Fernwartung der entstehenden Software zu schaffen. Eine Hauptaufgabe war dabei, übersichtliche Berichte aus verstreuten Logdateien zu erzeugen. Da ihm die vorhandenen Sprachen und Werkzeuge 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 nahe 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 genau 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 Flaschenhälse beim Datenaustausch. Andererseits erlauben sie einen wesentlich kompakteren Programmierstil, da die Benutzung eines UNIX-Werkzeugs 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. Er fügte Eigenschaften der Bourne Shell, in geringem Maße auch Elemente aus Pascal und BASIC, sowie eigene Ideen dazu.[5] 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“.
Name
[Bearbeiten | Quelltext bearbeiten]Der Name Perl bezieht sich auf ein Zitat aus dem Matthäus-Evangelium (Mt 13,46 EU),[6] 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 stilmischender 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, da es sich nun mal nicht um ein Akronym handelt.[7]
Perl 1 bis 4
[Bearbeiten | Quelltext bearbeiten]
Am 18. Dezember 1987[8] publizierte Larry Wall sein Programm im Usenet als Perl 1.0, das damals noch eine mächtigere 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 Wall 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 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 Publikationen, was sich erst im neuen Jahrtausend etwas relativierte. Der Verlag betrieb 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 und entwickelte Perl 5 vollständig neu.
Perl 5
[Bearbeiten | Quelltext bearbeiten]
Perl 5.0 wurde am 18. Oktober 1994 veröffentlicht und war der bis dahin größte Fortschritt 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 wurde schließlich 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 (der Pfeil-Operator ist eigentlich der Dereferenzierungsoperator, der aus einem Objekt, das aus einer Referenz auf die Klasse besteht, eine bestimmte Methode dereferenziert). Es entstand auch XS, eine Schnittstellenbeschreibungssprache, 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 Porters, 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.
In den Jahren nach Version 5.0 wurde nicht nur Perl auf Macintosh und Windows portiert, sondern es verschob sich auch die Nummerierung der Versionen. Da sich an der Syntax nichts Wesentliches änderte, beließ man die 5 und erhöhte bei größeren Meilensteinen die erste Nachkommastelle, verwendete aber zusätzliche Nummern, um die Zwischenschritte zu zählen. Da Perl erst ab 5.6 mit Versionsnummern, die mehrere Kommata enthalten, umgehen konnte, wurden sie bis dahin z. B. Perl 5.001 oder Perl 5.001012 geschrieben. Ab 5.6 wurde auch das damals von Linux verwendete Versionsschema übernommen, bei dem gerade Nummern auf Fehlerfreiheit gepflegte Benutzerversionen hindeuten und ungerade auf Entwicklerversionen, in die neue Funktionen einfließen. Serien von Benutzerversionen (z. B. 5.8.x) werden untereinander binär kompatibel gehalten, was bedeutet, dass ein für Perl 5.8.7 kompiliertes Binärmodul auch mit 5.8.8, nicht jedoch zwingend mit 5.10 oder 5.6.1 funktioniert.
Perl 5.6
Diese Version brachte am 22. März 2000 einige neue experimentelle Fähigkeiten, die erst später ausreiften, wie Unicode und UTF-8, Threads und cloning. Auch 64-Bit-Prozessoren konnten nun genutzt werden. Sprachlich fügte diese von Gurusamy Sarathy geleitete Reihe vor allem lexikalisch globale Variablen (mit our
) und eine Vektorschreibweise, die den Vergleich mehrstelliger Versionsnummern erlaubt, sowie die Spezialvariablen @-
und @+
, ein.
Perl 5.8
Mit der am 18. Juli 2002 von Nicholas Clark betreuten Reihe 5.8.x wurden vor allem die Probleme mit Unicode und den Threads behoben, aber auch die Ein-/Ausgabe (IO), Signale und die numerische Genauigkeit wurden entscheidend verbessert.
Ab Perl 5.10
[Bearbeiten | Quelltext bearbeiten]Neben verringertem Speicherverbrauch und einer erneuerten und nun auch austauschbaren Regex-Maschine brachte diese Version am 18. Dezember 2007 unter der Führung von Rafaël Garcia-Suarez vor allem Neuerungen, die dem Entwurf von Perl 6 entstammen und deren Gebrauch entweder einzeln oder kollektiv mit use feature ':5.10';
angemeldet werden muss oder kürzer use v5.10;
. Dies gilt ab dieser Version für alle Funktionen, welche die Kompatibilität brechen könnten. Hierzu zählen say
, given
und when
(analog zur switch
-Anweisung in C), der smartmatch-Operator (~~
), der defined or-Operator (//
) und state
-Variablen, welche die Erzeugung von Closures vereinfachen. Weitere nennenswerte Neuheiten umfassen den verlagerbaren Installationspfad, stapelbare Dateitestoperatoren, definierbare lexikalische Pragmas, optionale C3-Serialisierung der Objektvererbung und field hashes (für „inside out“-Objekte). Die Regex-Engine arbeitet nun iterativ statt rekursiv, was rekursive Ausdrücke ermöglicht. Komplexe Suchanfragen können nun auch verständlicher und weniger fehleranfällig durch named captures formuliert werden. Die Spezialvariablen $#
und $*
sowie die Interpreterschnittstellen perlcc und JPL wurden entfernt.
Im folgenden Jahr wurden die Quelle von Perforce auf Git umgestellt, was die Entwicklung und Herausgabe neuer Versionen wesentlich vereinfachte.
Perl 5.12
Diese von Jesse Vincent geleitete Version vom 12. April 2010 beinhaltet weit weniger große und sichtbare Veränderungen als 5.10. use v5.12;
impliziert use strict;
und use feature 'unicode_strings';
, wodurch alle Befehle Strings als Unicode behandeln. Unter den technischen Verbesserungen sind besonders der aktualisierte Unicode (5.2), DTrace-Unterstützung und Sicherheit von Datumsangaben jenseits von 2038 hervorzuheben, suidperl wurde entfernt. Aus Perl 6 wurden der Ellipsen-Operator (yada-yada) und die Regex-Escape-Sequence \N übernommen, Modulversionen können jetzt von package und use verwaltet werden. Ebenfalls neu ist die Möglichkeit, eigene Schlüsselwörter durch Perlroutinen zu definieren. Dies ist allerdings als experimentell markiert und kann sich ändern. Für bessere Planbarkeit und Zusammenarbeit mit Distributionen erscheint ab 5. Dezember 2000 am 20. jedes Monats eine Entwicklerversion, alle 3 Monate eine kleine Benutzerversion und jedes Jahr eine große.
Perl 5.14
Ab 14. Mai 2011 erleichtern neue Modifikatoren und Steuerzeichen den Umgang mit Unicode, der auf den Stand 6.0 gebracht wurde. Built-ins für Listen und Hashes dereferenzieren automatisch (autoderef) und weite Teile der Dokumentation wurden überarbeitet oder neu geschrieben. Auch die Unterstützung von IPv6 wurde verbessert, sowie das Anbinden von Multithread-Bibliotheken erleichtert.
Perl 5.16
Die am 20. Mai 2012 herausgegebene Version beinhaltet zahlreiche syntaktische Glättungen, in Teilen erneuerte Dokumentation und den Wechsel zu Unicode 6.1. Die Leitung hatte Jesse Vincent und ab November 2011 Ricardo Signes. Durch einen neu eröffneten Spendentopf der Perl Foundation konnten zudem zwei langjährige Entwickler dazu verpflichtet werden, undankbare Aufgaben zum Abschluss zu führen und den Build-Prozess zu vereinfachen. Einzige grundlegend neue Funktionalität ist das mit use feature 'current_sub';
oder use v5.16;
zuschaltbare Token __SUB__
, eine Referenz auf die aktuelle Routine.
Perl 5.18
Die am 18. Mai 2013 erschienenen Funktionalitäten lexikalische Subroutinen (lexical_subs) und mit Mengenfunktionen erzeugte Zeichenklassen innerhalb regulärer Ausdrücke sind beide experimentell. Solche Funktionen, zu denen auch lexikalische Kontextvariablen (lexical_topic) und der Smartmatch-Operator gehören, erzeugen jetzt Warnhinweise, die mit no warnings 'experimental::funktionsname'; oder no warnings 'experimental'; abgeschaltet werden können. Die Hashes wurden konsequent randomisiert, um Programme besser gegen DoS-Attacken zu schützen.
Perl 5.20
Ebenfalls unter der Führung von Ricardo Signes kamen am 27. Mai 2014 die experimentellen Funktionalitäten der Subroutinen-Signaturen (signatures) und (postderef) eine alternative Postfix-Syntax zum Dereferenzieren. Das mit 5.14 aufgenommene autoderef wurde als experimentell herabgestuft. Unicode 6.3 wird unterstützt und mit drand48 hat Perl nun einen eigenen, plattformunabhängig guten Zufallszahlengenerator. String- und Arraygrößen sind jetzt 64-Bit Werte.
Perl 5.22
Mit dem 1. Juni 2015 kamen der Doppeldiamantoperator (<<>>), bitweise Stringoperatoren (&. |. ^. ~.), ein 'strict'-Modus für reguläre Ausdrücke use re 'strict';
(re_strict), Unicode 7.0, Aliasing von Referenzen (refaliasing) und konstante Routinen (const_attr), die stets den mit der ersten Kompilierung ermittelten konstanten Wert liefern. Alle benannten Funktionalitäten (Name in Klammern) sind vorerst experimentell.
Perl 5.24
brachte am 9. Mai 2016 Beschleunigungen für Blöcke und numerische Operationen, sowie Unicode 8.0. Die Features postderef und postderef_qq wurden angenommen – autoderef und lexical_topic entfernt.
Perl 5.26
Unter Leitung von SawyerX wurde am 30. Mai 2017 die Regex-Option xx, einrückbare Here-Dokumente und Unicode 9.0 eingeführt. Das Feature lexical_subs wurde angenommen und '.'
(das aktuelle Verzeichnis) wurde aus Sicherheitsgründen standardmäßig aus @INC
(der Liste von Suchpfaden für Module) entfernt.
Perl 5.28
Erschien am 22. Juni 2018. Nebst Unicode 10.0 erhielt Perl alpha assertions in Lang- und Kurzfassungen. Das sind Aliase für besondere Regex-Gruppen mit sprechenden Namen: zum Beispiel anstatt (?=...)
, nun auch (*positive_lookahead:...)
oder (*pla:...)
. (*script_run: …)
oder (*sr: …)
wurde eingeführt, um einheitlich kodierten Text zu erkennen, was hilft Angriffen durch manipulierte Eingaben auszuweichen. Drei kritische Sicherheitslücken wurden geschlossen, mehrfache Dereferenzierungen und Zusammenführungen von Zeichenketten beschleunigt, sowie die Operatoren (&. |. ^. ~.
) sind nicht mehr experimentell. Außerdem wurde beschlossen, im Dokument perldeprecation darüber Buch zu führen, wann welche Funktion (mit 2 Versionen Vorwarnzeit) entfernt wird.
Perl 5.30
Aktualisierte am 22. Mai 2019 auf Unicode 12.1, führte die Unicode Wildcard Properties ein und erlaubte einen lookbehind in der Länge zu begrenzen. Entfernt wurden $[
, $*
, $#
und File::Glob::glob
, sowie Variablendeklarationen in nachgestellten, bedingten Ausdrücken.
Perl 5.32
Führte am 20. Juni 2020 verkettete Vergleichsoperatoren ($d < $e <= $f
), den isa
-Operator (prüft Klassenzugehörigkeit) und Unicode 13 ein. \p{name=...}
erlaubt es innerhalb einer Regex Ausdrücke zu Unicode-Namen zu interpolieren.
Perl 5.34
Am 20. Mai 2021 wurde eine Ausnahmebehandlung a la Try::Tiny (feature try) in den Kern übernommen und die alternative Schreibweise für Oktaldarstellung von Literalen 0oddddd
. Die neue Dokumentationsseite perlgov schreibt den einen neuen Prozess fest, nachdem sich die Perlgemeinschaft zukünftig selbsttätig, ohne den Einfluss von Larry Wall regiert.
Perl 5.36
Ricardo Signes verkündete am 28. Mai 2022 Ausnahmen mit finally
-Blöcken, defer
-Blöcke, for
-Schleifen mit mehreren Laufvariablen, Unicode 14, sowie eine neue Klasse an Hilfsfunktionen, welche über das Pragma builtin
importiert werden. Signaturen und Mengenoperationen auf Zeichenklassen wurden stabil markiert und use v5.36;
aktiviert das Pragma 'warnings'
sowie deaktiviert indirekte Methodenaufrufe ($x = new Class;)
, sowie die aus Perl 4 belassenen simulierten verschachtelten Hashes.
Perl 5.38
Mit 2. Juli 2023 kam eine Objektorientierung die mit den Schlüsselworten class
, method
und field
arbeitet und die bisherige nicht ersetzt. Eingeführt wurden auch die Spezialvariablen $ENV{PERL_RAND_SEED}
, ${^LAST_SUCCESSFUL_PATTERN}
und %{^HOOK}
, sowie die buitins indexed
, is_tainted
und export_lexically
.
Perl 5.40
Am 9. Juni 2024 wurden das Attribut :reader
für field
Variablen, das Token __CLASS__
und der Operator ^^
eingeführt. Es kamen auch die builtins inf
, nan
und load_module
und das feature
try erreicht den Status stabil.
Aktuelle Versionen
[Bearbeiten | Quelltext bearbeiten]Auch wenn die neueste Benutzerversion 5.40.0 lautet, wird derzeit die Versionsreihe 5.38.x weiterhin gepflegt (aktuell ist 5.38.4). Die Versionen 5.36.3, 5.34.3, 5.32.1, 5.30.3, 5.28.3, 5.26.3, 5.24.4, 5.22.4, 5.20.3, 5.18.2, 5.16.3, 5.14.4, 5.12.5, 5.10.1 und 5.8.9 sind Schlusspunkte ihrer Reihe, sicherheitsrelevante Verbesserungen werden noch bis zu 3 Jahre nach Veröffentlichung einer Version nachgereicht. Bei Kernmodulen wird meist auf eine Kompatibilität bis zu 5.6 geachtet, bei wichtigen CPAN-Modulen meist 5.8.3. Änderungen finden im Entwicklerzweig mit ungerader Versionsnummer statt (aktuell 5.41.x), der nicht für allgemeine Benutzung bestimmt ist. Da sich Perl 6 zu einer eigenständigen Sprache entwickelt hat, wird die nächste große Version Perl 7 heißen.
Raku (Perl 6)
[Bearbeiten | Quelltext bearbeiten]Perl 6, das 2020 zu Raku umbenannt wurde, ist eine Schwestersprache, deren Interpreter und die umgebende Infrastruktur vollständig neu entworfen wurden.
Merkmale
[Bearbeiten | Quelltext bearbeiten]Prinzipien
[Bearbeiten | Quelltext bearbeiten]Perl wurde für den praktischen Einsatz entwickelt und konzentriert sich daher auf schnelle und einfache Programmierbarkeit, Vollständigkeit und Anpassbarkeit. Diese Philosophie drückt sich in den folgenden Schlagworten oder Phrasen aus, die meist von Larry Wall stammen.
Mehrere Wege
[Bearbeiten | Quelltext bearbeiten]Das bekannteste und grundlegendste Perl-Motto ist „There is more than one way to do it“ (deutsch: „Es gibt mehr als einen Weg, etwas zu tun“), was meist zu TIMTOWTDI (selten TMTOWTDI) oder (mit englischer Kontraktion) „Tim To[a]dy“ verkürzt wird.[9] 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 (hier wäre, mit leichten Unterschieden, <STDIN>
äquivalent, was jedoch viel länger zu schreiben wäre). Diese Vielfalt wird auch im CPAN sichtbar, wo oft mehrere Module einen sehr ähnlichen Zweck erfüllen oder einen, der ebenso (wenn auch umständlicher) ad hoc implementiert werden könnte (Beispiel Getopt::Long
[10]).
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 freisteht, strukturierte, objektorientierte, funktionale und imperative Sprachmerkmale zu kombinieren.
Einfach und möglich
[Bearbeiten | Quelltext bearbeiten]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 bedeutet für Perl aber auch, möglichst keine vorbereitenden Programmieranweisungen zu verlangen, wie das Anmelden von Variablen oder das Schreiben einer Klasse. 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 ersten beiden Ziele nicht kollidieren zu lassen, gewinnt mit dem wachsenden 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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]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. Typischerweise 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.
Strenggenommen ist Perl daher keine interpretierte Sprache, da ein Perl-Programm vor jeder Ausführung kompiliert wird. Das führt etwa dazu, dass – anders als bei rein interpretierten Sprachen – ein Programm mit Syntaxfehlern oder fehlenden Abhängigkeiten nicht startet.
Verbreitung
[Bearbeiten | Quelltext bearbeiten]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 („Klebstoff-Sprache“), weil mit Hilfe von relativ schnell geschriebenen Perl-Skripten inkompatible Software verbunden werden kann. Bis heute gehört Perl auf allen POSIX-kompatiblen und Unix-ähnlichen Systemen zur Grundausstattung.
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 Microsoft 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, Movable Type, LiveJournal und Xing 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, Catalyst, Jifty, Mojolicious und Dancer, die eine sehr schnelle Entwicklung komplexer und leicht veränderbarer Webseiten erlauben. Auch Wiki-Software ist häufig in Perl geschrieben wie z. B. Socialtext, welches auf Mason basiert, Kwiki, TWiki, Foswiki, ProWiki oder UseMod. Auch verbreitete Ticket-Systeme mit Webschnittstelle wie Bugzilla oder RT sind in Perl geschrieben.
Jedoch sind WWW-Anwendungen weiterhin nur eines der vielen Einsatzgebiete von Perl. Wichtige Perl-Programme im E-Mail-Bereich sind SpamAssassin (Spam-Filter), PopFile und open webmail. Zur Systemverwaltung wird Perl zum Beispiel in debconf, einem Teil der Paketverwaltung des Betriebssystems Debian, benutzt.
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 in Perl geschrieben werden. Die heutigen Computer sind schnell genug, diese Programme flüssig auszuführen.
Bereiche, in denen Skriptsprachen wie Perl nicht sinnvoll eingesetzt werden können, sind zum einen Anwendungen mit hohen Anforderungen an Hardware-Nähe oder Geschwindigkeit wie zum Beispiel Treiber oder Codecs. Zum anderen sollten sie nicht in stark sicherheitskritischen Bereichen (z. B. Flugzeugsteuerung) Verwendung finden, da aufgrund der laxen Syntaxprüfung (z. B. fehlendes/sehr schwaches Typsystem) viele Fehler erst zur Laufzeit auftreten und eine Verifizierung im Allgemeinen nicht möglich ist.
Perl-Portierungen existierten für über 100 Betriebssysteme.[11]
Perl und andere Programmiersprachen
[Bearbeiten | Quelltext bearbeiten]Für Aufgaben, die mit Perl nur schwierig oder langsam lösbar sind, bietet Perl mit dem Modul Inline[12] eine Schnittstelle an, über die Programmteile in anderen Sprachen in ein Perl-Programm eingebunden werden können. Unterstützte Sprachen sind u. a. C, C++, Assembler, Java, Python, Ruby, Fortran und Octave.[13]
Anwendungsgebiete sind z. B.:
- rechenintensive Formeln (C, Assembler),
- Lösung komplexer Probleme mit existierenden Systemen (Octave, Fortran-Bibliotheken) und
- zusammenführen von Anwendungen in unterschiedlichen Sprachen („Glue-Funktion“ von Perl).
Die Anwendung von Inline ist relativ einfach und gut dokumentiert. Bei kompilierten Programmteilen führt Inline mittels MD5-Kennung Buch über den Versionsstand, wodurch Mehrfachkompilierung des gleichen Codes vermieden wird.
Bei Inline erfordert die Übergabe der Parameter und Rückgabe der Ergebnisse einigen Aufwand. Bei kurzen Berechnungen überwiegt dieser Aufwand den Gewinn an Geschwindigkeit. Wird zum Beispiel die Mandelbrot-Menge berechnet, indem die Formel über Inline als C-Funktion berechnet, die Iteration aber in Perl belassen, verlangsamt sich die Programmausführung gegenüber einer reinen Perl-Implementierung. Wird hingegen auch die Iterationsschleife in C ausgelagert, steigert sich die Performance signifikant.
Logos
[Bearbeiten | Quelltext bearbeiten]
Als Maskottchen von Perl dient ein Dromedar. Es zierte erstmals den Umschlag des auch als Kamelbuch 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 ActivePerl von ActiveState schmückt.
Syntax
[Bearbeiten | Quelltext bearbeiten]Freies Format
[Bearbeiten | Quelltext bearbeiten]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. Einige Sprachelemente wie Formate, heredocs und gewöhnliche reguläre Ausdrücke sind nicht formatfrei.
Variablen
[Bearbeiten | Quelltext bearbeiten]Charakteristisch für Perl ist, dass Variablen durch ein Präfix (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 kein 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 (Ganz/Gleitkomma) oder Referenzen auf andere Daten oder Funktionen in ihnen gespeichert sein. Strings und Zahlen werden bei Bedarf automatisch und transparent ineinander umgewandelt, eine große Besonderheit von Perl.
- Arrays fassen mehrere Skalare unter einem Variablennamen zusammen. Arrayeinträge haben einen Index. Die Zählung beginnt bei 0, wenn nichts anderes definiert wurde.
- 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 (Referenzen 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. our
macht eine Variable im gesamten Programm verfügbar. undef variable
gibt die angegebene Variable wieder frei.
Kontrollstrukturen
[Bearbeiten | Quelltext bearbeiten]Die grundlegenden Kontrollstrukturen unterscheiden sich kaum von denen in C, Java und JavaScript.
Bedingte Ausführung
[Bearbeiten | Quelltext bearbeiten]if
funktioniert wie aus C bekannt; unless (<Bedingung>)
, eine Besonderheit von Perl, ist eine Schreibweise für if (!(<Bedingung>))
. Eine Case- oder Switch-Anweisung (given when
) gibt es erst ab Perl 5.10, vorher musste man diese Struktur mit if … elsif … else
nachbilden. Jedoch setzt given
die Kontextvariable ($_
) wie for
und when
wendet smartmatch (~~
) darauf an, was dieses Konstrukt ungleich vielfältiger einsetzbar macht als traditionelle Case-Befehle. Das optionale default
entspricht hier einem else
. 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>}]
given (<variable>) {
[when (<Wert>) {<Anweisungen>}]
[default {<Anweisungen>}]
}
<Bedingung> ? <Anweisung1> : <Anweisung2>;
<Ausdruck1> || <Ausdruck2>;
<Ausdruck1> && <Ausdruck2>;
Schleifen
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]Seit seinen Anfängen waren reguläre Ausdrücke (Regex) ein besonderes Merkmal von Perl, da ähnliche Fähigkeiten bis dahin meist nur spezialisierte Sprachen wie Snobol und awk hatten. Durch die große Verbreitung setzte Perl einen inoffiziellen Standard, der durch die von Perl unabhängige und auch teilweise abweichende Bibliothek PCRE aufgegriffen wurde, die heute von mehreren bedeutenden Sprachen und Projekten verwendet wird.
Ab Version 5.0 hat Perl seine Regex-Fähigkeiten um viele Funktionen, wie z. B. 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 Schrägstriche häufig 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. Dasm
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 aktivierterg
-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, mitc
-Option die Anzahl der Funde.i
lässt Groß- und Kleinschreibung ignorieren,o
Variablen nur einmal interpolieren,m
den String als mehrzeilig unds
als einzeilig betrachten. Diex
-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 erkannten String$'
– String nach dem erkannten 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
[Bearbeiten | Quelltext bearbeiten]Quoting-Operatoren:
q
– quote nicht interpretierter String (alias zu ' ')qq
– quote interpretierter String (alias zu " ")qw
– quote words, eine Liste von mit Whitespace (Leerraum) getrennten Stringsqr
– quote oder kompiliere regexqx
– quote auszuführende externe Anwendung (basierend auf Perlsreadpipe
)
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 . ' has worked 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 has worked 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 has worked in company "$company" for $years years.};
Kritik
[Bearbeiten | Quelltext bearbeiten]Häufigster Kritikpunkt an Perl ist, dass darin geschriebene Programme schlecht lesbar seien. Zudem bietet Perl überdurchschnittlich viele Freiheiten, die zu unleserlichem Code führen können (siehe Disziplinen). Andererseits ermöglicht die gleiche Freiheit es auch, nahe an der logischen Struktur des Problems oder dem menschlichen Verständnis zu programmieren. Die von Perl-Programmierern geschätzte Freiheit, persönlichen Vorlieben nachzugehen, muss bei Projekten, die von mehreren Programmierern oder über längere Zeiträume entwickelt werden, durch selbst auferlegte Regeln eingeschränkt werden, um spätere Probleme zu vermeiden. Dies erfordert zusätzlichen Kommunikationsaufwand oder die Verwendung von statischen Code-Analyse-Tools wie Perl::Critic.
Einige Teile der Syntax, wie der Ausdruck der 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 standardisierten Herangehensweisen besonders von Perl-Anfängern zusätzliche Tipp- und Denkarbeit. Mit zusätzlichen Modulen lassen sich viele der Schwierigkeiten minimieren. So gibt es mit English ein Core-Modul, das den Spezialvariablen aussagekräftigere Namen gibt und mit Moose ein sehr modernes und umfangreiches Objektsystem, das sich stark an das von Raku anlehnt. Es gilt heute als De-facto-Standard für objektorientierte Programmierung mit Perl.[14] Signaturen wurden mit 5.20 eingeführt, sind aber immer noch als experimentell eingestuft.
Weiterhin wurde Perl vorgeworfen, es verletze die UNIX-Philosophie. Siehe dazu den Abschnitt Entstehung.
Kritik wurde auch gegen Raku erhoben, das zu hoch gesteckte Ziele habe und nach vielen Jahren keine sichtbaren Ergebnisse bringe, stattdessen die Zukunft von Perl lähme. Raku war von Anfang an als Langzeitprojekt ausgerufen, das ausschließlich auf nicht immer planbarer Freiwilligenarbeit und kaum finanzieller Unterstützung beruht. Seine konkreten Ziele zeichneten sich erst im Verlauf der Entwicklung ab, und es gab eindeutige Probleme bei der Kommunikation und der Außendarstellung. Allerdings stammen seit Perl 5.10 wesentliche Neuerungen aus der Schwestersprache.
Perl-Kultur und Spaß
[Bearbeiten | Quelltext bearbeiten]Gemeinschaft
[Bearbeiten | Quelltext bearbeiten]
Wie auch bei anderen Projekten freier Software gibt es zwischen vielen Entwicklern und Benutzern der Sprache besondere soziale Bindungen, und es bildete sich eine eigene Kultur daraus. Die Perl-Kultur ist von Offenheit, Gastlichkeit und Hilfsbereitschaft, aber auch von Individualismus, Spieltrieb und Humor geprägt. 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 mittlerweile 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 und die gespendeten Gelder für einflussreiche Projekte und Personen, Organisation von Entwicklerkonferenzen und den Betrieb der wichtigsten Perl betreffenden Webseiten verwendet.
Treffen, Workshops und Konferenzen
[Bearbeiten | Quelltext bearbeiten]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[15] der erste war. Workshops wollen ambitionierte Entwickler in einem möglichst erschwinglichen Rahmen lokal zusammenführen. Ein ähnliches Ziel haben die größeren Yet Another Perl Conferences (YAPC), die für die Regionen Nordamerika, Brasilien, Europa, Asien, Russland und Israel abgehalten werden. Am größten, allerdings auch am teuersten ist die von O’Reilly in den USA ausgerichtete The Perl Conference (TPC), die mittlerweile Teil der OSCON ist.
Seit etwa 2005 werden für engagierte Beitragende auch Hackathons abgehalten.
Disziplinen
[Bearbeiten | Quelltext bearbeiten]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 für 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.[16] 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 (Verschleierung), 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 5. 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 öffentlich begonnene 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
[Bearbeiten | Quelltext bearbeiten]Es gibt viele bekannte Mottos und Zitate, die sich mit Perl selbst oder den Möglichkeiten der Sprache beschäftigen; hier einige Kostproben:
- “Perl: the Swiss Army Chainsaw of Programming Languages.”
(Perl: Die Schweizer Armee-Kettensäge der Programmiersprachen. Anspielung auf die Vielseitigkeit von Schweizer Taschenmessern.) - “Perl is the only language that looks the same before and after RSA encryption.” (Keith Bostic)
(Perl ist die einzige Sprache, die vor und nach einer RSA-Verschlüsselung gleich aussieht.) - “Only perl can parse Perl.” (Larry Wall)
(Nur perl kann Perl parsen.) - “… we often joke that a camel is a horse designed by a committee, but if you think about it, the camel is pretty well adapted for life in the desert. The camel has evolved to be relatively self-sufficient. On the other hand, the camel has not evolved to smell good. Neither has Perl.” (Larry Wall: über das Kamel als Perl-Maskottchen)
(… 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.) - “The very fact that it’s possible to write messy programs in Perl is also what makes it possible to write programs that are cleaner in Perl than they could ever be in a language that attempts to enforce cleanliness” (Larry Wall: Linux World, 1999)
(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.) - “Perl: Write once – never understand again”
(Perl: Einmal schreiben – nie wieder verstehen. Eine Anspielung auf das Mantra Write once – run everywhere von Java)
Auszeichnungen
[Bearbeiten | Quelltext bearbeiten]Wettbewerbe
- Im Jahr 2004 erreichte Perl beim 7. Wettbewerb des International Conference on Functional Programming Contest eine Platzierung in der Lightning Division und gewann 2007 den zweiten Platz.
Literatur
[Bearbeiten | Quelltext bearbeiten]- Tom Christiansen, brian d foy, Larry Wall: Programming Perl. 4. Auflage. O’Reilly, Sebastopol CA, 2012, ISBN 978-0-596-00492-7
- Randal L. Schwartz, brian d foy, Tom Phoenix: Learning Perl. 7. Auflage. O’Reilly, Sebastopol CA, 2017, ISBN 978-1-4919-5432-4.
- Randal L. Schwartz, brian d foy, Tom Phoenix: Intermediate Perl. 2. Auflage. O’Reilly, Sebastopol, CA, 2012, ISBN 978-1-4493-9309-0.
- brian d foy: Mastering Perl. 2. Auflage. O’Reilly, Sebastopol CA, 2014, ISBN 978-1-4493-9311-3.
- Joseph N. Hall, brian d foy, Joshua A. McAdams: Effective Perl Programming. 2. Auflage. Addison-Wesley, Boston MA, 2010, ISBN 978-0-321-49694-2.
- chromatic: Modern Perl, Onyx Neon Press 2011, ISBN 0-9779201-7-8. (aktuellere Referenz, als E-Book frei erhältlich)
- Damian Conway: Perl Best Practices. O’Reilly, Sebastopol CA, 2005, ISBN 978-0-596-00173-5.
- Damian Conway: Object Oriented Perl. Manning Publications, Greenwich CT, 2000, ISBN 1-884777-79-1.
- Peteris Krumins: Perl One-liners. No Starch Press, San Francisco CA, 2014, ISBN 978-1-59327-520-4.
- Johan Vromans: Perl Pocket Reference. 5. Auflage. O’Reilly, Sebastopol CA, 2011, ISBN 978-1-4493-0370-9
- Jon Orwant (Hrsg.): Games, Diversions & Perl Culture. O’Reilly, Sebastopol CA, 2010, ISBN 978-0-596-00312-8.
- Jürgen Schröter: Grundwissen Perl, Oldenbourg 2007, ISBN 978-3-486-58074-7.
- Mark Jason Dominus: Higher-Order Perl. Morgan Kaufmann, 2005, ISBN 1-55860-701-3 (Funktionale Programmierung in Perl)
Weblinks
[Bearbeiten | Quelltext bearbeiten]- perl.org – Offizielle, sehr umfangreiche Website von Perl (allgemeine Informationen; englisch)
- perl.com (englisch)
- PerlMonks Community (englisch)
- Perldoc Browser (englisch)
- Deutsches Perl-Tutorial für Einsteiger
- Deutsches Perl-Tutorial für Einsteiger und Fortgeschrittene
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Perl 5.40.2 is now available! 13. April 2025 (abgerufen am 13. April 2025).
- ↑ Larry Wall: Programming is Hard, Let’s Go Scripting … auf perl.com vom 6. Dezember 2007; abgerufen am 1. Juni 2019.
- ↑ Larry Wall: Perl, the first postmodern computer language, abgerufen am 31. Dezember 2018.
- ↑ What is Raku (Perl 6)? im Perlfaq
- ↑ manpage von Perl 1.0 in der Perl-Timeline. auf perl.org (englisch)
- ↑ Kate Johanns: Tech Time Warp: Why Perl — the “duct tape of the internet” — was such a gem SmarterMSP, 20. Dezember 2019, abgerufen am 15. November 2020.
- ↑ Der erste Teil der offiziellen Perl-FAQ (englisch)
- ↑ Tabelle aller Erscheinungsdaten von Perl (POD-Dokument; englisch) in der offiziellen CPAN-Distribution
- ↑ TMTOWTDI im englischsprachigen Wiktionary
- ↑ Getopt::Long auf CPAN
- ↑ Liste der bekannten Ports auf CPAN
- ↑ Modul Inline auf CPAN
- ↑ GNU Octave auf gnu.org
- ↑ Why Modern Perl Teaches OO with Moose. chromatic
- ↑ 22nd German Perl/Raku Workshop 2020 in Erlangen.
- ↑ zum Beispiel Perl-Poetry-Kategorie perlmonks.org (englisch)