Perl

  Bild:Programming-republic-of-perl.gif
Paradigma: Multi-Paradigma
Erschien in: 1987
Entworfen von: Larry Wand
Neueste Erscheinung: 5.8.8 / 31. Januar 2006
Schreibdisziplin: Dynamisch
Beeinflusst von: AWK, BASIC-PLUS, C, C++ , Lisp, Pascal, Sed, Unix-Shell
Beeinflusst: Python, PHP, Rubin
SIE: Plattformübergreifend
Lizenz: GNU General Public License, Künstlerische Lizenz
Webseite: http://www.perl.org/

Perl ist eine dynamische Programmiersprache, die von Larry Wall entworfen und erstmals 1987 veröffentlicht wurde. Perl leiht sich Funktionen aus einer Vielzahl anderer Sprachen aus, darunter C, Shell-Skripting ( sh), AWK, sed und Lisp.

Strukturell basiert Perl auf dem durch Klammern getrennten Blockstil von AWK und C und wurde aufgrund seiner Stärken in der Zeichenfolgenverarbeitung und des Fehlens der willkürlichen Einschränkungen vieler Skriptsprachen zu dieser Zeit weit verbreitet.



Geschichte

Wall begann 1987 mit der Arbeit an Perl, während er als Programmierer bei Unisys arbeitete, und veröffentlichte am 18. Dezember 1987 Version 1.0 in der Newsgroup comp.sources.misc. Die Sprache expandierte in den nächsten Jahren schnell. Perl 2, das 1988 veröffentlicht wurde, enthielt eine bessere Engine für reguläre Ausdrücke. Perl 3, das 1989 veröffentlicht wurde, fügte Unterstützung für Binärdaten hinzu.

Bis 1991 war die einzige Dokumentation für Perl eine einzige (immer länger werdende) Manpage. 1991, Perl programmieren (das Kamelbuch) wurde veröffentlicht und wurde zum de facto Referenz für die Sprache. Gleichzeitig wurde die Perl-Versionsnummer auf 4 erhöht, nicht um eine größere Änderung in der Sprache zu markieren, sondern um die Version zu identifizieren, die durch das Buch dokumentiert wurde.

Perl 4 durchlief eine Reihe von Wartungsversionen, die 1993 in Perl 4.036 gipfelten. Zu diesem Zeitpunkt gab Larry Wall Perl 4 auf, um mit der Arbeit an Perl 5 zu beginnen. Perl 4 bleibt bis heute in Version 4.036.

Die Entwicklung von Perl 5 wurde bis 1994 fortgesetzt. Die Mailingliste perl5-porters wurde im Mai 1994 eingerichtet, um die Arbeit an der Portierung von Perl 5 auf verschiedene Plattformen zu koordinieren. Es bleibt das primäre Forum für die Entwicklung, Wartung und Portierung von Perl 5.

Perl 5 wurde am 17. Oktober 1994 veröffentlicht. Es war eine fast vollständige Neufassung des Interpreters und fügte der Sprache viele neue Funktionen hinzu, darunter Objekte, Referenzen, Pakete und Module. Wichtig ist, dass Module einen Mechanismus zur Verfügung stellten, um die Sprache zu erweitern, ohne den Interpreter zu modifizieren. Dadurch konnte sich der Core-Interpreter stabilisieren, während es normalen Perl-Programmierern ermöglichte, neue Sprachfunktionen hinzuzufügen.

Am 26. Oktober 1995 wurde das Comprehensive Perl Archive Network (CPAN) gegründet. Das CPAN ist eine Sammlung von Websites, die Perl-Quellen, binäre Distributionen, Dokumentationen, Skripte und Module archivieren und verteilen.

Ab 2006 wird Perl 5 immer noch aktiv gepflegt. Wichtige Funktionen und einige wesentliche neue Sprachkonstrukte wurden im Laufe der Zeit hinzugefügt, darunter Unicode-Unterstützung, Threads, eine verbesserte Unterstützung für objektorientierte Programmierung und viele andere Verbesserungen. Die neueste stabile Version ist Perl 5.8.8.

Name

Perl hieß ursprünglich „Pearl“, nach dem Gleichnis von der Perle. Larry Wall wollte der Sprache einen Kurznamen mit positiven Konnotationen geben; er behauptet, dass er jedes Wort mit drei und vier Buchstaben im Wörterbuch angesehen (und abgelehnt) habe. Er überlegte auch, es nach seiner Frau Gloria zu benennen. Wall entdeckte die bestehende Programmiersprache PEARL vor der offiziellen Veröffentlichung von Perl und änderte die Schreibweise des Namens.

Der Name wird normalerweise groß geschrieben ( Perl ) bei Bezugnahme auf die Sprache und Großschreibung ( Perl ), wenn auf das Interpreterprogramm selbst verwiesen wird, da bei Unix-ähnlichen Dateisystemen zwischen Groß- und Kleinschreibung unterschieden wird. Vor der Veröffentlichung der ersten Ausgabe von Perl programmieren es war üblich, die Sprache als zu bezeichnen Perl ; Randal L. Schwartz hat jedoch den Namen der Sprache in dem Buch großgeschrieben, damit er beim Setzen besser hervorsticht. Die Fallunterscheidung wurde anschließend von der Community übernommen.

Der Name wird gelegentlich auch als „PERL“ (z P praktisch UND Extraktion u R Hafen L Sprache). Obwohl sich die Erweiterung in vielen heutigen Handbüchern, einschließlich der offiziellen Perl-Manpage, durchgesetzt hat, ist sie ein Backronym und offiziell steht der Name für nichts. Die Schreibweise von PERL in Großbuchstaben wird daher als Schibboleth zur Erkennung von Community-Außenseitern verwendet. Es wurden mehrere andere Backronyme vorgeschlagen, einschließlich der humorvollen Pathologisch eklektischer Mülllister .

Das Kamelsymbol

Perl wird im Allgemeinen durch ein Kamel symbolisiert, was auf das Bild zurückzuführen ist, das der Herausgeber O'Reilly Media für das Cover von gewählt hat Perl programmieren , die folglich den Namen erhielt Das Kamelbuch . O'Reilly besitzt das Symbol als Marke, behauptet jedoch, ihre gesetzlichen Rechte nur zum Schutz der Marke zu nutzen „Integrität und Wirkung dieses Symbols“ . O'Reilly erlaubt die nicht-kommerzielle Nutzung des Symbols und stellt Logos der Programming Republic of Perl (siehe oben) und Powered-by-Perl-Schaltflächen zur Verfügung.

Überblick

Perl ist eine universelle Programmiersprache, die ursprünglich für die Textbearbeitung entwickelt wurde und heute für eine Vielzahl von Aufgaben verwendet wird, darunter Systemadministration, Webentwicklung, Netzwerkprogrammierung, GUI-Entwicklung und mehr.

Die Sprache soll eher praktisch (einfach zu verwenden, effizient, vollständig) als schön (winzig, elegant, minimal) sein. Zu den Hauptmerkmalen gehört die Unterstützung mehrerer Programmierparadigmen (prozedural, objektorientiert und funktionell Stile), automatische Speicherverwaltung, integrierte Unterstützung für die Textverarbeitung und eine große Sammlung von Modulen von Drittanbietern.

Merkmale

Die Gesamtstruktur von Perl leitet sich weitgehend von C ab. Perl ist von Natur aus prozedural, mit Variablen, Ausdrücken, Zuweisungsanweisungen, geschweiften Codeblöcken, Kontrollstrukturen und Subroutinen.

Perl übernimmt auch Funktionen aus der Shell-Programmierung. Alle Variablen sind mit führenden Sigillen gekennzeichnet, die den Datentyp (Skalar, Array, Hash etc.) der Variablen im Kontext eindeutig identifizieren. Wichtig ist, dass Siegel ermöglichen, dass Variablen direkt in Zeichenfolgen interpoliert werden. Wie die Unix-Shells hat Perl viele eingebaute Funktionen für allgemeine Aufgaben wie Sortieren und für den Zugriff auf Systemeinrichtungen.

Perl übernimmt Listen von Lisp, assoziative Arrays (Hashes) von AWK und reguläre Ausdrücke von sed. Diese vereinfachen und erleichtern viele Parsing-, Textverarbeitungs- und Datenverwaltungsaufgaben.

In Perl 5 wurden Funktionen hinzugefügt, die komplexe Datenstrukturen, erstklassige Funktionen (z. B. Closures als Werte) und ein objektorientiertes Programmiermodell unterstützen. Dazu gehören Verweise, Pakete, klassenbasierter Methodenversand und Variablen mit lexikalischem Gültigkeitsbereich sowie Compilerdirektiven (z. B. das Pragma). Eine wichtige zusätzliche Funktion, die mit Perl 5 eingeführt wurde, war die Möglichkeit, Code als wiederverwendbare Module zu verpacken. Larry Wall erklärte später: 'Die ganze Absicht des Modulsystems von Perl 5 bestand darin, das Wachstum der Perl-Kultur und nicht des Perl-Kerns zu fördern.'

Alle Versionen von Perl führen automatische Datentypisierung und Speicherverwaltung durch. Der Interpreter kennt den Typ und die Speicheranforderungen jedes Datenobjekts im Programm; es weist ihnen Speicher nach Bedarf zu und gibt ihn frei. Legal Type-Konvertierungen werden automatisch zur Laufzeit durchgeführt; Unzulässige Typkonvertierungen sind schwerwiegende Fehler.

Entwurf

Das Design von Perl kann als Reaktion auf drei allgemeine Trends in der Computerindustrie verstanden werden: sinkende Hardwarekosten, steigende Arbeitskosten und Verbesserungen in der Compiler-Technologie. Viele frühere Computersprachen wie Fortran und C wurden entwickelt, um teure Computerhardware effizient zu nutzen. Im Gegensatz dazu ist Perl darauf ausgelegt, teure Computerprogrammierer effizient zu nutzen.

Perl hat viele Funktionen, die die Arbeit des Programmierers auf Kosten größerer CPU- und Speicheranforderungen erleichtern. Dazu gehören die automatische Speicherverwaltung; dynamisches Tippen; Strings, Listen und Hashes; Reguläre Ausdrücke; Introspektion und eine Funktion.

Wall wurde als Linguist ausgebildet, und das Design von Perl ist stark von linguistischen Prinzipien geprägt. Beispiele hierfür sind die Huffman-Codierung (übliche Konstruktionen sollten kurz sein), eine gute Endgewichtung (die wichtigen Informationen sollten zuerst kommen) und eine große Sammlung von Sprachprimitiven. Perl bevorzugt Sprachkonstrukte, die für Menschen natürlich zu lesen und zu schreiben sind, selbst wenn sie den Perl-Interpreter verkomplizieren.

Die Perl-Syntax spiegelt die Idee wider, dass 'Dinge, die anders sind, auch anders aussehen sollten'. Beispielsweise haben Skalare, Arrays und Hashes unterschiedliche führende Sigille. Array-Indizes und Hash-Schlüssel verwenden verschiedene Arten von geschweiften Klammern. Zeichenfolgen und reguläre Ausdrücke haben unterschiedliche Standardtrennzeichen. Dieser Ansatz kann mit Sprachen wie Lisp verglichen werden, wo dasselbe S-Ausdruckskonstrukt und dieselbe grundlegende Syntax für viele verschiedene Zwecke verwendet werden.

Perl erzwingt kein bestimmtes Programmierparadigma (prozedural, objektorientiert, funktional usw.) oder fordert den Programmierer sogar auf, zwischen ihnen zu wählen.

Sowohl die Perl-Sprache als auch die Gemeinschaft und Kultur, die sie umgeben, haben einen breiten praktischen Bezug. Das Vorwort zu Perl programmieren beginnt, 'Perl ist eine Sprache, um Ihre Arbeit zu erledigen.' Eine Folge davon ist, dass Perl keine aufgeräumte Sprache ist. Es enthält Funktionen, wenn Benutzer sie verwenden, toleriert Ausnahmen von seinen Regeln und verwendet Heuristiken, um syntaktische Mehrdeutigkeiten aufzulösen. Aufgrund der nachsichtigen Natur des Compilers können Fehler manchmal schwer zu finden sein. In Bezug auf das unterschiedliche Verhalten eingebauter Funktionen in Listen- und Skalarkontexten sagt die Handbuchseite perlfunc(1) 'Im Allgemeinen tun sie, was Sie wollen, es sei denn, Sie wollen Konsistenz.'

Perl hat mehrere Mottos, die Aspekte seines Designs und seiner Verwendung vermitteln. Einer ist 'Es gibt mehr als einen Weg, es zu tun.' (TMTOWTDI, normalerweise ausgesprochen „Tim Toady“). Andere sind 'Perl: die Kettensäge der Schweizer Armee unter den Programmiersprachen' und 'Keine unnötigen Grenzen' . Ein erklärtes Designziel von Perl ist es, einfache Aufgaben einfach und schwierige Aufgaben zu ermöglichen. Perl wurde auch aufgerufen 'Das Klebeband des Internets' .

Anwendungen

Perl hat viele und vielfältige Anwendungen, die durch die Verfügbarkeit vieler Standard- und Drittanbieter-Module verstärkt werden.

Perl wird seit den Anfängen des Webs zum Schreiben von CGI-Skripten verwendet. Es ist als eines der „drei Ps“ (Perl, Python und PHP) bekannt, die die beliebtesten Skriptsprachen zum Generieren von Webanwendungen sind, und ist ein integraler Bestandteil des beliebten LAMP-Lösungsstacks für die Webentwicklung. Zu den großen Projekten, die in Perl geschrieben wurden, gehören Slash, IMDb und UseModWiki, eine frühe, einflussreiche Wiki-Engine. Viele stark frequentierte Websites wie Amazon.com und Ticketmaster.com verwenden Perl ausgiebig.

Perl wird oft als Klebesprache verwendet, um Systeme und Schnittstellen zusammenzubinden, die nicht speziell für die Zusammenarbeit entwickelt wurden, und zum 'Datenmunging', Konvertieren oder Verarbeiten großer Datenmengen für Aufgaben wie das Erstellen von Berichten. Tatsächlich sind diese Stärken eng miteinander verbunden. Die Kombination macht Perl zu einem beliebten Allzweckwerkzeug für Systemadministratoren, zumal kurze Programme auf einer einzigen Befehlszeile eingegeben und ausgeführt werden können.

Perl wird auch häufig im Finanz- und Bioinformatik , wo es für die schnelle Anwendungsentwicklung und -bereitstellung sowie die Fähigkeit, große Datensätze zu verarbeiten, geschätzt wird.

Implementierung

Perl ist als in C geschriebener Kerninterpreter implementiert, zusammen mit einer großen Sammlung von Modulen, die in Perl und C geschrieben sind. Die Quelldistribution ist seit 2005 12 MB groß, wenn sie in eine tar-Datei gepackt und komprimiert wird. Der Interpreter besteht aus 150.000 Zeilen C-Code und wird auf typischen Maschinenarchitekturen zu einer ausführbaren Datei von 1 MB kompiliert. Alternativ kann der Interpreter zu einer Linkbibliothek kompiliert und in andere Programme eingebettet werden. Die Distribution enthält fast 500 Module, die 200.000 Zeilen Perl und weitere 350.000 Zeilen C-Code umfassen. Ein Großteil des C-Codes in den Modulen besteht aus Zeichenkodierungstabellen.

Der Interpreter hat eine objektorientierte Architektur. Alle Elemente der Perl-Sprache – Skalare, Arrays, Hashes, Coderefs, Dateihandles – werden im Interpreter durch C-Strukturen repräsentiert. Operationen auf diesen Strukturen werden durch eine große Sammlung von Makros, Typedefs und Funktionen definiert; diese bilden die Perl-C-API. Die Perl-API kann für Uneingeweihte verwirrend sein, aber ihre Einstiegspunkte folgen einem einheitlichen Namensschema, das den Benutzern eine Anleitung bietet.

Die Ausführung eines Perl-Programms lässt sich grob in zwei Phasen unterteilen: Kompilierzeit und Laufzeit. Zur Kompilierzeit zerlegt der Interpreter den Programmtext in einen Syntaxbaum. Zur Laufzeit führt es das Programm aus, indem es den Baum durchläuft. Der Text wird nur einmal analysiert, und der Syntaxbaum wird vor seiner Ausführung einer Optimierung unterzogen, sodass die Ausführungsphase relativ effizient ist. Optimierungen zur Kompilierzeit des Syntaxbaums umfassen konstante Faltung und Kontextweitergabe, aber es wird auch eine Peephole-Optimierung durchgeführt. Kompilierzeit- und Laufzeitphasen können jedoch verschachtelt sein: BEGIN-Codeblöcke werden zur Kompilierzeit ausgeführt, während die Funktion eval die Kompilierung während der Laufzeit initiiert. Beide Operationen sind in einer Reihe anderer implizit enthalten - insbesondere die Klausel use, die Bibliotheken lädt, die in Perl als Module bekannt sind, impliziert einen BEGIN-Block.

Perl ist eine dynamische Sprache und hat eine kontextsensitive Grammatik, die durch Code beeinflusst werden kann, der während einer intermittierenden Laufzeitphase ausgeführt wird. (Siehe Beispiele. ) Daher kann Perl nicht durch eine direkte Lex/Yacc-Lexer/Parser-Kombination geparst werden. Stattdessen implementiert der Interpreter seinen eigenen Lexer, der mit einem modifizierten GNU-Bison-Parser koordiniert, um Mehrdeutigkeiten in der Sprache aufzulösen. Es wird gesagt, dass 'nur Perl Perl parsen kann', was bedeutet, dass nur die Perl-Interpreter ( Perl ) kann die Perl-Sprache analysieren ( Perl ). Die Wahrheit davon wird durch die anhaltenden Unzulänglichkeiten anderer Programme bestätigt, die sich verpflichten, Perl zu parsen, wie etwa Quellcode-Analysatoren und Auto-Indenter, die nicht nur mit den vielen Möglichkeiten zu kämpfen haben, eindeutige syntaktische Konstrukte auszudrücken, sondern auch mit der Tatsache dass Perl im allgemeinen Fall nicht geparst werden kann, ohne es auszuführen.

Die Wartung des Perl-Interpreters ist im Laufe der Jahre immer schwieriger geworden. Die Codebasis wird seit 1994 kontinuierlich weiterentwickelt. Der Code wurde auf Kosten von Einfachheit, Klarheit und starken internen Schnittstellen auf Leistung optimiert. Es wurden neue Funktionen hinzugefügt, die praktisch vollständige Abwärtskompatibilität mit früheren Versionen bleibt jedoch erhalten. Die Größe und Komplexität des Interpreters ist ein Hindernis für Entwickler, die daran arbeiten möchten.

Perl wird mit rund 120.000 Funktionstests vertrieben. Diese werden als Teil des normalen Build-Prozesses ausgeführt und üben den Interpreter und seine Kernmodule ausgiebig aus. Perl-Entwickler verlassen sich auf die funktionalen Tests, um sicherzustellen, dass Änderungen am Interpreter keine Fehler einführen; Umgekehrt können Perl-Benutzer, die sehen, dass der Interpreter seine Funktionstests auf ihrem System besteht, ein hohes Maß an Vertrauen haben, dass er ordnungsgemäß funktioniert.

Es gibt keine schriftliche Spezifikation oder keinen Standard für die Perl-Sprache und es ist nicht geplant, einen solchen für die aktuelle Version von Perl zu erstellen. Es hat immer nur eine Implementierung des Interpreters gegeben. Dieser Interpreter steht zusammen mit seinen Funktionstests als ein de facto Spezifikation der Sprache.

Verfügbarkeit

Perl ist freie Software und sowohl unter der Artistic License als auch der GNU General Public License lizenziert. Distributionen sind für die meisten Betriebssysteme verfügbar. Es ist besonders weit verbreitet auf Unix und Unix-ähnliche Systeme, aber es wurde auf die meisten modernen (und viele veraltete) Plattformen portiert. Mit nur sechs gemeldeten Ausnahmen kann Perl auf allen Unix-ähnlichen, POSIX-kompatiblen oder anderweitig Unix-kompatiblen Plattformen aus dem Quellcode kompiliert werden. Dies ist jedoch selten erforderlich, da Perl in der Standardinstallation vieler gängiger Betriebssysteme enthalten ist.

Aufgrund spezieller Änderungen, die zur Unterstützung von Mac OS Classic erforderlich sind, wurde ein spezieller Port namens MacPerl unabhängig davon ausgeliefert.

Fenster

Benutzer von Microsoft Windows Installieren Sie normalerweise eine native Binärdistribution von Perl. Das Kompilieren von Perl aus dem Quellcode unter Windows ist möglich, aber den meisten Installationen fehlt der erforderliche C-Compiler.

Die Cygwin-Emulationsschicht bietet eine weitere Möglichkeit, Perl unter Windows auszuführen. Cygwin bietet eine Unix-ähnliche Umgebung unter Windows, die gcc enthält, sodass das Kompilieren von Perl aus dem Quellcode eine zugänglichere Option für Benutzer ist, die diesen Ansatz wählen.

Im Juni 2006 wurde win32.perl.org von Adam Kennedy im Auftrag der The Perl Foundation gestartet. Es ist eine Community-Website für „alles rund um Windows und Perl“.

Sprachstruktur

In Perl wird das kanonische Hello World-Programm gelegentlich wie folgt angegeben:

#!/usr/bin/perl -w
use strict;
print "Hello, world!\n";    # "\n" is a 'newline'

Die erste Zeile ist der Shebang, der dem Betriebssystem mitteilt, wo der Perl-Interpreter zu finden ist. Die zweite Zeile stellt die vor strikt Pragma, das in vielen großen Softwareprojekten zur Qualitätskontrolle eingesetzt wird. Der dritte gibt die Zeichenfolge aus Hallo Welt! und ein Zeilenumbruch. Ein Kommentar ( '\n' ist ein 'newline' ) folgt.

Das # Das Zeichen in der dritten Zeile ist ein 'Kommentar-Token', das es dem Perl-Interpreter erlaubt, alles nach dem zu ignorieren # bis zum Ende der Codezeile.

Der Shebang ist die übliche Art, den Interpreter auf Unix-Systemen aufzurufen. Windows-Systeme verlassen sich möglicherweise auf den Shebang oder verknüpfen eine Dateierweiterung mit dem Perl-Interpreter. Einige Texteditoren verwenden die Shebang-Zeile auch als Hinweis darauf, in welchem ​​Modus sie arbeiten sollen. Wenn das Programm von Perl ausgeführt und nicht über die Shell aufgerufen wird, wird die Zeile, die mit dem Shebang beginnt, nach Optionen durchsucht und ansonsten ignoriert. Einzelheiten finden Sie auf der Perlrun-Manpage.

Es sollte beachtet werden, dass das Perl-Programm „Hello World“ keine Variablen, Subroutinen oder irgendetwas anderes benötigt, das möglicherweise sogar das strikte Pragma verletzt, ohne einen schwerwiegenden Fehler zu verursachen ohne Die Verwendung von strikten Einschränkungen, und da die Verwendung von strengen Beschränkungen keine Voraussetzung für ein 'Hello World'-Programm ist, ist der einzige Grund dafür streng verwenden darin soll vermieden werden, von anderen Programmierern möglicherweise angeschrien zu werden, weil sie nicht strict verwenden.

Da es außerdem durchaus möglich ist, den Perl-Interpreter direkt von einer Befehlszeile aus aufzurufen, und außerdem die 'shebang'-Zeile kein Teil von Perl ist, sondern von einigen Shells benötigt wird (und von Perl als Kommentar behandelt wird), ist die shebang-Zeile ist eigentlich auch nicht nötig. Tatsächlich ist es in den meisten Win32-Implementierungen völlig nutzlos.

Schließlich sind erklärende Kommentare in einem demonstrativen 'Hallo Welt'-Programm nicht erforderlich. Darüber hinaus benötigt die letzte Zeile eines beliebigen Codeblocks in einem Perl-Programm, der den impliziten Block um das gesamte Skript herum enthält, eigentlich kein Semikolon als Abschlusszeichen.

In Wirklichkeit ist das in Perl also das kanonische Hello-World-Programm

print "Hello, world!\n"

und das ist alles.

Datentypen

Perl hat vier grundlegende Datentypen: Skalare, Listen, Hashes und Dateihandles:

  • Ein Skalar ist ein einzelner Wert; es kann eine Zahl, ein String oder eine Referenz sein
  • Eine Liste ist eine geordnete Sammlung von Skalaren (eine Variable, die eine Liste enthält, heißt an Reihe )
  • Ein Hash oder assoziatives Array ist eine Abbildung von Strings auf Skalare; Die Saiten werden aufgerufen Schlüssel und die Skalare heißen Werte .
  • Ein Dateihandle ist eine Zuordnung zu einer Datei, einem Gerät oder einer Pipe, die zum Lesen, Schreiben oder für beides geöffnet ist.

Alle Variablen sind durch ein führendes Sigil gekennzeichnet, das den Datentyp identifiziert, auf den zugegriffen wird (nicht den Typ der Variablen selbst), mit Ausnahme von Dateihandles, die dies nicht sind. Derselbe Name kann ohne Konflikte für Variablen unterschiedlichen Typs verwendet werden.

 $foo   # a  scalar
 @foo   # an  array
 %foo   # a  hash
 foo    # a  Filehandle, but nice programmers use FOO, not foo.

Zahlen werden wie üblich geschrieben; Zeichenfolgen werden in Anführungszeichen verschiedener Art eingeschlossen.

 $n      = 42;
 $name   = "joe";
 $colour  = 'red';
 $animal = qq!frog!;

Perl wandelt Strings in Zahlen um und umgekehrt, abhängig vom Kontext, in dem sie verwendet werden. Im folgenden Beispiel werden die Zeichenfolgen $n und $m als Zahlen behandelt, wenn sie Argumente für den Additionsoperator sind. Dieser Code gibt die Zahl '5' aus und verwirft Nicht-Zahleninformationen für die Operation, obwohl die Variablenwerte gleich bleiben. (Der Zeichenfolgenverkettungsoperator ist nicht +, sondern .)

 $n     = "3 apples";
 $m     = "2 oranges";
 print $n + $m;

Perl hat auch einen booleschen Kontext, den es beim Auswerten von Bedingungsanweisungen verwendet. Die folgenden Werte werden in Perl alle als falsch ausgewertet:

 $false = 0;     # the number zero
 $false = 0.0;   # the number zero as a float
 $false = '0';   # the string zero
 $false = "";    # the empty string
 $false = undef; # the return value from undef

Alle anderen Werte werden als wahr ausgewertet. Dies schließt die ungerade selbstbeschreibende Zeichenfolge „0 aber wahr“ ein, die tatsächlich 0 als Zahl ist, aber wahr ist, wenn sie als boolescher Wert verwendet wird. (Jeder nicht-numerische String hätte diese Eigenschaft ebenfalls, aber dieser spezielle String wird von Perl in Bezug auf numerische Warnungen ignoriert.) Eine weniger explizite, aber konzeptionell tragbarere Version dieses Strings ist '0E0' oder '0e0', was nicht der Fall ist Verlassen Sie sich darauf, dass Zeichen als 0 ausgewertet werden, da '0E0' buchstäblich 'null hoch zum Exponenten von null' ist.

Ausgewertete boolesche Ausdrücke geben auch skalare Werte zurück. Auch wenn die Dokumentation nichts verspricht besondere wahr oder falsch zurückgegeben wird (und daher nicht verlässlich ist), viele boolesche Operatoren geben 1 für wahr und die leere Zeichenkette für falsch zurück (was in einem numerischen Kontext zu Null ausgewertet wird). Das definiert() Die Funktion teilt mit, ob die Variable einen bestimmten Wert hat. In den obigen Beispielen definiert($false) gilt für jeden Wert außer undef .

Wenn ein bestimmtes 1- oder 0-Ergebnis (wie in C) benötigt wird, halten einige Autoren eine explizite Konvertierung für erforderlich:

 my $real_result = $boolean_result ? 1 : 0;

Stattdessen kann jedoch eine implizite Konvertierung verwendet werden:

 my $real_result = $boolean_result + 0;

Eine Liste wird geschrieben, indem ihre Elemente aufgelistet werden, durch Kommas getrennt und in Klammern eingeschlossen, wo dies aufgrund der Operatorpriorität erforderlich ist.

 @scores = (32, 45, 16, 5);

Oder es kann zumindest auf ein halbes Dutzend andere Arten geschrieben werden:

 @scores = qw(32 45 16 5);
 @scores = split /-/, '32-45-16-5';
 push @scores, $_ for 32, 45, 16, 5;

Ein Hash kann aus einer Liste von Schlüssel/Wert-Paaren initialisiert werden.

 %favorite = (joe => 'red',
              sam => 'blue');

Oder es kann einfach Stück für Stück definiert werden:

 $favourite{joe} = 'red';
 $favourite{sam} = 'blue';

Der Zugriff auf einzelne Elemente einer Liste erfolgt über einen numerischen Index in eckigen Klammern. Auf einzelne Werte in einem Hash wird zugegriffen, indem der entsprechende Schlüssel in geschweiften Klammern angegeben wird. Das Sigil identifiziert das Element, auf das zugegriffen wird, als Skalar.

 $scores[2]      # an element of @scores
 $favorite{joe}  # a value in %favorite

Auf mehrere Elemente kann zugegriffen werden, indem stattdessen das Siegel verwendet wird (das Ergebnis wird als Liste identifiziert).

 @scores[2, 3, 1]    # three elements of @scores
 @favorite{'joe', 'sam'} # two values in %favorite

Die Anzahl der Elemente in einem Array kann durch Auswertung des Arrays im skalaren Kontext oder mit Hilfe des Siegels ermittelt werden. Letzteres gibt den Index des letzten Elements im Array an, nicht die Anzahl der Elemente.

 $count = @friends;
 $#friends       # the index of the last element in @friends
 $#friends+1     # usually the number of elements in @friends
                 # this is one more than $#friends because the first element is at
                 # index 0, not 1. Unless the programmer reset this to a
                 # different value, which most Perl manuals encourage her
                 # not to do.

Es gibt einige Funktionen, die mit ganzen Hashes arbeiten.

 @names     = keys   %address;
 @addresses = values %address;
 1 while ($name, $address) = each %address;

Kontrollstrukturen

Perl hat mehrere Arten von Kontrollstrukturen.

Es hat blockorientierte Kontrollstrukturen, ähnlich denen in den Programmiersprachen C und Java. Bedingungen sind von Klammern umgeben, kontrollierte Blöcke von geschweiften Klammern:

label while ( cond ) { ... }
label while ( cond ) { ... } continue { ... }
label for ( init-expr ; cond-expr ; incr-expr ) { ... }
label foreach var ( list ) { ... }
label foreach var ( list ) { ... } continue { ... }
if ( cond ) { ... }
if ( cond ) { ... } else { ... } 
if ( cond ) { ... } elsif ( cond ) { ... } else { ... } 

Wenn nur eine einzelne Anweisung gesteuert wird, bieten Anweisungsmodifikatoren eine leichtere Syntax:

statement if      cond ;
statement unless  cond ;
statement while   cond ;
statement until   cond ;
statement foreach list ;

Logische Kurzschlussoperatoren werden häufig verwendet, um den Kontrollfluss auf Ausdrucksebene zu bewirken:

expr and expr
expr or  expr

Die Flusssteuerungsschlüsselwörter , , und sind Ausdrücke, sodass sie mit Kurzschlussoperatoren verwendet werden können.

Perl hat auch zwei implizite Schleifenkonstrukte:

 results = grep { ... } list
 results = map  { ... } list

gibt alle Elemente von zurück aufführen für die der kontrollierte Block wahr auswertet. wertet den kontrollierten Block für jedes Element aus aufführen und gibt eine Liste der resultierenden Werte zurück. Diese Konstrukte ermöglichen einen einfachen funktionalen Programmierstil.

In Perl 5 gibt es keine switch-Anweisung (multi-way branch). Die Perl-Dokumentation beschreibt ein halbes Dutzend Möglichkeiten, denselben Effekt durch Verwendung anderer Kontrollstrukturen zu erzielen. Es gibt jedoch ein Switch-Modul, das Funktionen bietet, die dem bevorstehenden Re-Design von Perl 6 nachempfunden sind.

Perl enthält eine Anweisung, die jedoch selten verwendet wird. Situationen, in denen a in anderen Sprachen erforderlich ist, treten in Perl aufgrund der breiten Flusssteuerungsoptionen nicht so häufig auf.

Es gibt auch eine Anweisung, die einen Tail-Call durchführt. Es beendet die aktuelle Subroutine und ruft sofort die angegebene . Dies wird in Situationen verwendet, in denen ein Aufrufer eine effizientere Stack-Verwaltung durchführen kann als Perl selbst (normalerweise, weil keine Änderung am aktuellen Stack erforderlich ist), und in tiefer Rekursion kann das Tail-Calling einen erheblichen positiven Einfluss auf die Leistung haben, da es den Overhead des Bereichs vermeidet /stack-Verwaltung bei der Rückkehr.

Unterprogramme

Subroutinen werden mit dem Schlüsselwort definiert und einfach durch Benennung aufgerufen. Wenn die betreffende Subroutine noch nicht deklariert wurde, sind Klammern für eine ordnungsgemäße Analyse erforderlich.

foo();             # parentheses required here...
sub foo { ... }
foo;               # ... but not here

Eine Liste von Argumenten kann nach dem Subroutinennamen bereitgestellt werden. Argumente können Skalare, Listen oder Hashes sein.

foo $x, @y, %z;

Die Parameter eines Unterprogramms müssen weder nach Zahl noch nach Typ deklariert werden; Tatsächlich können sie von Anruf zu Anruf variieren. Arrays werden auf ihre Elemente erweitert, Hashes werden zu einer Liste von Schlüssel/Wert-Paaren erweitert, und das Ganze wird als eine undifferenzierte Liste von Skalaren an die Subroutine übergeben.

Welche Argumente auch immer übergeben werden, sie stehen der Subroutine im speziellen Array zur Verfügung. Die Elemente von sind den eigentlichen Argumenten zugeordnet; Das Ändern eines Elements von ändert das entsprechende Argument.

Auf Elemente von kann zugegriffen werden, indem sie auf die übliche Weise subskribiert werden.

$_[0], $_[1]

Der resultierende Code kann jedoch schwer lesbar sein, und die Parameter haben Pass-by-Reference-Semantik, was unerwünscht sein kann.

Eine gebräuchliche Redewendung ist die Zuweisung an eine Liste benannter Variablen.

my($x, $y, $z) = @_;

Dies wirkt sich sowohl auf mnemonische Parameternamen als auch auf die Pass-by-Value-Semantik aus. Das Schlüsselwort gibt an, dass die folgenden Variablen lexikalisch auf den enthaltenden Block beschränkt sind.

Eine andere Redewendung ist das Verschieben von Parametern von . Dies ist besonders häufig der Fall, wenn die Subroutine nur ein Argument akzeptiert.

my $x = shift;

Subroutinen können Werte zurückgeben.

return 42, $x, @y, %z;

Wenn die Subroutine nicht über eine Anweisung beendet wird, gibt sie den letzten Ausdruck zurück, der im Hauptteil der Subroutine ausgewertet wurde. Arrays und Hashes im Rückgabewert werden zu Listen von Skalaren erweitert, genau wie bei Argumenten.

Der zurückgegebene Ausdruck wird im aufrufenden Kontext des Unterprogramms ausgewertet; dies kann die Unvorsichtigen überraschen.

sub list  {      (4, 5, 6)     }
sub array { @x = (4, 5, 6); @x }
$x = list;   # returns 6 - last element of list
$x = array;  # returns 3 - number of elements in list
@x = list;   # returns (4, 5, 6)
@x = array;  # returns (4, 5, 6)

Eine Subroutine kann ihren aufrufenden Kontext mit der Funktion entdecken.

sub either { wantarray ? (1, 2) : "Oranges" }
$x = either;    # returns "Oranges"
@x = either;    # returns (1, 2)

Reguläre Ausdrücke

Die Perl-Sprache enthält eine spezialisierte Syntax zum Schreiben regulärer Ausdrücke (REs), und der Interpreter enthält eine Engine zum Abgleichen von Zeichenfolgen mit regulären Ausdrücken. Die Engine für reguläre Ausdrücke verwendet einen Backtracking-Algorithmus, der ihre Fähigkeiten vom einfachen Musterabgleich bis zur Erfassung und Substitution von Zeichenfolgen erweitert. Die Engine für reguläre Ausdrücke ist von Regex abgeleitet, die von Henry Spencer geschrieben wurde.

Die Perl-Syntax für reguläre Ausdrücke wurde ursprünglich von regulären Ausdrücken der Unix-Version 8 übernommen. Es wich jedoch vor der ersten Veröffentlichung von Perl ab und ist seitdem so gewachsen, dass es viele weitere Funktionen enthält. Andere Sprachen und Anwendungen übernehmen jetzt Perl-kompatible reguläre Ausdrücke über reguläre POSIX-Ausdrücke, darunter PHP, Ruby, Java und der Apache HTTP-Server.

Der (Match)-Operator führt eine Übereinstimmung mit einem regulären Ausdruck ein. (Der Anfang kann der Kürze halber weggelassen werden.) Im einfachsten Fall ist ein Ausdruck wie

 $x =~ m/abc/

wird als wahr ausgewertet, wenn und nur wenn die Zeichenfolge mit dem regulären Ausdruck übereinstimmt.

Teile eines regulären Ausdrucks können in Klammern eingeschlossen werden; entsprechende Teile einer übereinstimmenden Zeichenkette sind gefangen . Erfasste Zeichenfolgen werden den sequentiellen integrierten Variablen zugewiesen, und eine Liste erfasster Zeichenfolgen wird als Wert der Übereinstimmung zurückgegeben.

 $x =~ m/a(.)c/;  # capture the character between 'a' and 'c'

Der Operator (Ersatz) gibt eine Such- und Ersetzungsoperation an:

 $x =~ s/abc/aBc/;   # upcase the b

Perl können reguläre Ausdrücke annehmen Modifikatoren . Dies sind Einzelbuchstaben-Suffixe, die die Bedeutung des Ausdrucks ändern:

 $x =~ m/abc/i;      # case-insensitive pattern match
 $x =~ s/abc/aBc/g;  # global search and replace

Reguläre Ausdrücke können dicht und kryptisch sein. Dies liegt daran, dass die Syntax regulärer Ausdrücke äußerst kompakt ist und im Allgemeinen einzelne Zeichen oder Zeichenpaare verwendet, um ihre Operationen darzustellen. Perl bietet Abhilfe bei diesem Problem mit dem Modifikator, der es Programmierern ermöglicht, Leerzeichen und Kommentare zu platzieren Innerhalb Reguläre Ausdrücke:

 $x =~ m/a     # match 'a'
         .     # match any character
         c     # match 'c'
          /x;

Eine häufige Verwendung von regulären Ausdrücken besteht darin, Trennzeichen für den Operator anzugeben:

 @words = split m/,/, $line;   # divide $line into comma-separated values

Der Operator ergänzt die Zeichenfolgenerfassung. String Capture gibt die Teile eines Strings zurück, die mit einem regulären Ausdruck übereinstimmen; gibt die Teile zurück, die nicht übereinstimmen.

Datenbankschnittstellen

Perl wird weithin für Datenbankanwendungen bevorzugt. Seine Textverarbeitungsfunktionen eignen sich gut zum Generieren von SQL-Abfragen; Arrays, Hashes und automatische Speicherverwaltung erleichtern das Sammeln und Verarbeiten der zurückgegebenen Daten.

In frühen Versionen von Perl wurden Datenbankschnittstellen erstellt, indem der Interpreter mit einer clientseitigen Datenbankbibliothek neu verknüpft wurde. Das war etwas ungeschickt; Ein besonderes Problem bestand darin, dass die resultierende ausführbare Datei darauf beschränkt war, nur die eine Datenbankschnittstelle zu verwenden, mit der sie verknüpft war. Außerdem war die erneute Verknüpfung des Interpreters so schwierig, dass dies nur für einige der wichtigsten und am weitesten verbreiteten Datenbanken durchgeführt wurde.

In Perl 5 werden Datenbankschnittstellen durch Perl-DBI-Module implementiert. Das (Database Interface)-Modul stellt eine einzelne, datenbankunabhängige Schnittstelle zu Perl-Anwendungen dar, während die (Database Driver)-Module die Details des Zugriffs auf etwa 50 verschiedene Datenbanken handhaben. Es gibt Treiber für die meisten ANSI-SQL-Datenbanken.

Vergleichende Leistung

Die 'Computer Language Shootout Benchmarks' vergleichen die Leistung von Implementierungen typischer Programmierprobleme in mehreren Programmiersprachen. Ihre Perl-Implementierungen beanspruchten normalerweise mehr Speicher als Implementierungen in anderen Sprachen und hatten unterschiedliche Geschwindigkeitsergebnisse. Die Leistung von Perl im Shootout ist ähnlich wie bei anderen interpretierten Sprachen wie Python, PHP und Ruby, aber langsamer als bei den meisten kompilierten Sprachen.

Perl kann langsamer sein als andere Sprachen, die dasselbe tun, weil es den Quellcode jedes Mal kompilieren muss, wenn es ausgeführt wird. In „A Timely Start“ stellte Jean-Louis Leroy fest, dass die Ausführung seiner Perl-Skripte viel länger dauerte als erwartet, weil der Perl-Interpreter einen Großteil der Zeit damit verbrachte, Module zu finden und zu kompilieren. Da die meisten Perl-Programmierer nicht wissen, wie sie ihr Zwischenergebnis so speichern können, wie es Java, Python und Ruby problemlos tun, zahlen Perl-Skripte diesen Mehraufwand bei jeder Ausführung. Der Overhead ist kein so großes Problem, wenn er über eine lange Laufzeit amortisiert wird, kann aber die Messung sehr kurzer Ausführungszeiten, wie sie oft in Benchmarks zu finden sind, erheblich verzerren. Sobald Perl jedoch mit der Ausführungsphase beginnt, kann es ziemlich schnell sein und wird normalerweise andere dynamische Sprachen übertreffen. Technologien wie mod_perl überwinden dies, indem sie das kompilierte Programm zwischen mehreren Läufen im Speicher halten, oder Class::Autouse, um das Kompilieren von Teilen des Programms zu verzögern, bis es benötigt wird.

Optimierung

Nicholas Clark, ein Perl-Core-Entwickler, diskutiert einige Kompromisse beim Perl-Design und einige Lösungen in 'Wenn Perl nicht ganz schnell genug ist'. Die kritischsten Routinen eines Perl-Programms können über XS oder Inline in anderen Sprachen wie C oder Assembler geschrieben werden.

Das Optimieren von Perl kann eine genaue Kenntnis seiner Funktionsweise erfordern, anstatt Kenntnisse der Sprache und ihrer Syntax, was bedeutet, dass das Problem eher bei der Implementierung von Perl als bei der Sprache selbst liegt. Perl 6, die nächste Hauptversion, wird einige dieser Lektionen behandeln, die andere Sprachen bereits gelernt haben.

Zukunft

Auf der Perl-Konferenz 2000 plädierte Jon Orwant für eine große neue Sprachinitiative. Dies führte zu der Entscheidung, mit der Arbeit an einem Redesign der Sprache mit dem Namen Perl 6 zu beginnen. Vorschläge für neue Sprachfunktionen wurden von der Perl-Community im Allgemeinen erbeten, und über 300 RFCs wurden eingereicht.

Larry Wall verbrachte die nächsten Jahre damit, die RFCs zu verdauen und sie zu einem kohärenten Framework für Perl 6 zu synthetisieren. Er hat seinen Entwurf für Perl 6 in einer Reihe von Dokumenten namens Apokalypsen präsentiert, die entsprechend den Kapiteln in nummeriert sind Perl programmieren ('Das Kamelbuch'). Die aktuelle, noch nicht endgültige Spezifikation von Perl 6 ist in Designdokumenten zusammengefasst, die Synopsen genannt werden und entsprechend den Apokalypsen nummeriert sind.

Perl 6 soll nicht abwärtskompatibel sein, obwohl es einen Kompatibilitätsmodus geben wird.

Im Jahr 2001 wurde entschieden, dass Perl 6 auf einer sprachübergreifenden virtuellen Maschine namens Parrot laufen würde. Dies bedeutet, dass andere Sprachen, die auf Parrot abzielen, nativen Zugriff auf CPAN erhalten und ein gewisses Maß an sprachübergreifender Entwicklung ermöglichen.

2005 erstellte Audrey Tang das Pugs-Projekt, eine Implementierung von Perl 6 in Haskell. Dies war und ist weiterhin eine Testplattform für die Sprache Perl 6 (getrennt von der Entwicklung der eigentlichen Implementierung), die es den Sprachdesignern ermöglicht, sie zu erkunden. Das Pugs-Projekt hat eine aktive sprachübergreifende Perl/Haskell-Community hervorgebracht, die sich um den Freenode #perl6 IRC-Kanal dreht.

Eine Reihe von Funktionen in der Perl 6-Sprache zeigen jetzt Ähnlichkeiten mit Haskell, und Perl 6 wurde von der Haskell-Community als potenzielle Skriptsprache angenommen.

Ab 2006 befinden sich Perl 6, Parrot und Pugs in aktiver Entwicklung, und ein neues Modul für Perl 5 namens v6 ermöglicht es, dass ein Teil des Perl 6-Codes direkt auf Perl 5 ausgeführt werden kann.

Im Jahr 2006 wurde damit begonnen, Windows-Perl-Distributionen mit einem Compiler auszuliefern, um die Notwendigkeit von Binärpaketen unter Windows überflüssig zu machen. Einige frühe Ergebnisse davon sind der CamelPack-Makro-Installer und die Vanilla-Perl-Distributionen.

Spaß mit Perl

Perl hat eine starke Kultur mit vielen Traditionen, von denen einige nur für den Freizeitwert praktiziert werden.

Wie bei C sind Wettbewerbe mit verschleiertem Code der bekannteste Zeitvertreib. Der jährliche Obfuscated-Perl-Wettbewerb machte Perls syntaktische Flexibilität zu einer großen Tugend. Das folgende Programm gibt den Text 'Just another Perl / Unix hacker' aus, wobei 32 gleichzeitige Prozesse verwendet werden, die durch Pipes koordiniert werden. Eine vollständige Erklärung finden Sie auf der Website des Autors.

 @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

Dies ist auch ein Beispiel für eine Disziplin, die dem verschleierten Code ähnlich ist, sich aber etwas davon unterscheidet und als „JAPH“ bekannt ist. Im Sprachgebrauch der Perl-Kultur sind Perl-Programmierer als Perl-Hacker bekannt, und daraus leitet sich die Praxis ab, kurze Programme zu schreiben, um den Ausdruck 'Nur ein weiterer Perl-Hacker' auszugeben. Im Geiste des ursprünglichen Konzepts sind diese Programme mäßig verschleiert und kurz genug, um in die Signatur einer E-Mail oder Usenet-Nachricht zu passen. Das 'kanonische' JAPH enthält das Komma am Ende, obwohl dies oft weggelassen wird. Es wurden viele Varianten zum Thema erstellt, z. , die 'Just Another Perl Pirate!' ausgibt.

Eine weitere beliebte Abwechslung ist 'Perl Golf', das das gleiche Ziel wie der physische Sport hat: die Anzahl der Schläge zu reduzieren, die erforderlich sind, um ein bestimmtes Ziel zu erreichen. In diesem Zusammenhang bezieht sich 'Schläge' eher auf Tastenanschläge als auf Schwünge eines Golfschlägers. Ziele sind eng definierte, nicht-triviale Aufgaben, wie z. B. 'Eingabezeichenfolge scannen und das längste enthaltene Palindrom zurückgeben'. Die Teilnehmer versuchen, sich gegenseitig zu übertrumpfen, indem sie Lösungen schreiben, die immer weniger Zeichen des Perl-Quellcodes benötigen.

Ähnlich wie verschleierter Code und Golf, aber mit einem anderen Zweck, ist Perl-Poesie die Praxis, Gedichte zu schreiben, die tatsächlich als legaler (wenn auch im Allgemeinen unsinniger) Perl-Code kompiliert werden können. Dieses Hobby ist aufgrund der großen Anzahl normaler englischer Wörter, die in der Sprache verwendet werden, mehr oder weniger einzigartig für Perl. Neue Gedichte werden regelmäßig in der Perl Poetry-Sektion der Perl Monks-Site veröffentlicht. Ein Teil der Perl-Geschichte ist Black Perl, ein berüchtigtes Beispiel für Perl-Poesie.

Es gibt auch viele Codebeispiele, die nur zur Unterhaltung auf dem CPAN geschrieben wurden. Beispiele hierfür sind das Modul Lingua::Romana::Perligata , das das Schreiben von Programmen ermöglicht Latein . Bei der Ausführung eines solchen Programms übersetzt das Modul seinen Quellcode in reguläres Perl und führt es aus.

Die Perl-Gemeinschaft hat den 'Acme'-Namensraum für Module reserviert, die Spaß machen (aber sein Geltungsbereich wurde erweitert, um explorativen oder experimentellen Code oder andere Module einzuschließen, die nicht dazu bestimmt sind, jemals in der Produktion verwendet zu werden). Einige der Acme-Module sind bewusst amüsant implementiert. Einige Beispiele:

  • Acme::Bleach, eines der ersten Module im Acme::-Namensraum, ermöglicht es, den Quellcode des Programms „aufzuhellen“ (d. h. alle Zeichen durch Leerzeichen zu ersetzen) und dennoch zu funktionieren. Dies ist ein Beispiel für einen Quellenfilter. Es gibt auch eine Reihe anderer Quellfilter im Acme-Namespace.
  • Acme::Hello vereinfacht das Schreiben eines 'Hello, World!' Programm
  • Acme::Currency ermöglicht es Ihnen, das Präfix '$' für skalare Variablen in ein anderes Zeichen zu ändern
  • Acme::ProgressBar ist eine absichtlich schrecklich ineffiziente Methode, um den Fortschritt einer Aufgabe anzuzeigen
  • Acme::VerySign persifliert den weithin kritisierten VeriSign Site Finder-Dienst
  • Acme::Don't implementiert das logische Gegenteil des Schlüsselworts: das Schlüsselwort, das einen Block übernimmt, den es nicht ausführt. (Es sollte beachtet werden, dass bei Verwendung von don't{ ... } nicht dasselbe wie do not { ... } tut. Das tut es auch nicht.)