Zum Inhalt springen

Perl (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 31. März 2005 um 19:48 Uhr durch Markus.oehler (Diskussion | Beiträge) (Korr.). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Dieser Artikel beschäftigt sich mit der Skriptsprache Perl. Den Artikel zu der Gemeinde Perl im Saarland finden Sie unter Perl (Saarland) und den Schriftgrad Perl (5 Punkt) findet man unter Schriftgrad – Programmiersprachen mit ähnlichem Namen: Pearl.


Perl (sowohl als Practical Extraction and Report Language als auch als Pathologically Eclectic Rubbish Lister bezeichnet) ist eine von Larry Wall geschaffene freie, interpretierte und plattformunabhängige Programmiersprache (auch: Skriptsprache). Sie entstand aus einer Synthese aus C, den UNIX-Befehlen und anderen Programmiersprachen. Vorrangiges Ziel dieser Sprache ist eine schnelle, bequeme und individuelle Problemlösung.

Der Name Perl bezieht sich auf ein Zitat aus dem Matthäus-Evangelium und wurde von Pearl in Perl geändert, da es bereits eine Sprache namens Pearl gab.

Geschichte

Larry Wall war Angestellter der propulsion labs der NASA, wo er ein weit verstreutes Netzwerk von Rechnern zu betreuen hatte. Zur besseren Fernwartung entwickelte er eine kleine Sprache, mit der man schnell kleine Programme schreiben konnte, die ihm bei seiner Arbeit halfen. Dafür entnahm er fast allen damals verwendeten Computersprachen wie LISP, BASIC, Pascal, Ada, aber vor allem C die Ausdrucksweisen, die ihm „cool“ erschienen, bediente sich aber auch bei den grundlegenden UNIX-Werkzeugen wie shell, sed, awk oder grep.

Am 18. Dezember 1987 publizierte er es 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, mit der man wunderbar andere Programme steuern und gut lesbare Berichte ausgeben konnte. Bereits im nächsten Jahr erschien die Version 2.0 mit grunderneuerter und erweiterter Regex-Engine und einigen weiteren Verbesserungen. 1989 folgte Perl 3, das auch mit binären Daten umgehen konnte und erstmals auch unter der 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.

Der bisher größte Schritt für Perl war am 18. Oktober 1994 mit Perl 5 geschafft. Neben vielen weiteren wichtigen Weiterentwicklungen konnte man nun die Sprache durch separate Module erweitern, was kurze Zeit später zur Entstehung des CPAN führte. Dieses grosse Archiv frei erhältlicher Module ist heute einer wichtigsten Gründe, Perl zu benutzen. Mit der fünften Version wuchs Perl auch zu einer vollständigen Programmiersprache für grössere Projekte, da nun durch einen einfachen, aber eleganten Weg auch objektorientierte Programmierung(OOP) möglich wurde.

Seit Juli 2000 ist Perl 6 angekündigt, daß sehr viele Neuerungen bringen wird. Unter Larrys Regie und mit der Beteiligung vieler, vieler Freiwilliger wird die Sprache, die mit der Zeit an manchen Stellen zugewuchert ist, entrümpelt und mit vielen neuen Fähigkeiten ausgestattet. Diese Neugestaltung des Syntax ist in grossen Teilen abgeschlossen. Für Perl 6 wird auch ein komplett neuer Interpreter geschrieben (Parrot), der dafür ausgelegt ist, alle möglichen Sprachen direkt auszuführen oder in ausführbare Anweisungen (Maschinen- oder Byte-Code) zu übersetzen. Eine Testimplementation eines Perl-6-Parsers für Parrot namens Pugs schreibt derzeit Autrijus Tang in der Sprache Haskell. Sie wird wahrscheinlich Herbst 2005 funktionsfähig sein und wird es auch ermöglichen, wie geplant den Perl-6-Parser in Perl 6 zu schreiben. Perl 5 soll aber noch für einen langen Zeitraum gewartet werden und soll auch mit einem Parser namens Ponie, den Arthur Bergman derzeit enwickelt, auf Parrot ausführbar sein.

Aktuelle Version

Die aktuelle Weiterentwicklung findet durch die Entwicklerversion 5.9.x statt. Für den täglichen Gebrauch werden derzeit die Versionsreihen 5.6.x und 5.8.x gepflegt. Es wird allgemein empfohlen die aktuelle Version 5.8.5 zu benutzen, da sie die Probleme die es mit Unicode und Threads gab, größtenteils behebt. Die nächste Benutzerversion 5.8.10 ist in Vorbereitung.

Merkmale

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 es sich jedoch längst zu einer auch universell einsetzbaren Sprache weiterentwickelt. Systemadministratoren und Webentwickler (siehe CGI) 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 Skriptsprachen aus Geschwindigkeitsgründen ungeeignet sind.

Perl wurde für den praktischen Einsatz entwickelt und konzentriert sich daher auf einfache Programmierbarkeit, Vollständigkeit und Effizienz. Ein gern zitiertes Motto besagt, dass leichte Dinge einfach und komplexe Dinge möglich sein sollen.

Neben einer unkomplizierten Verwendung von Variablen (keine Festlegung von Datentypen notwendig) zeichnet sich Perl u.a. auch durch einen sehr ausgefeilten Mechanismus zur Textmustererkennung, die regulären Ausdrücke aus, der z.B. eine sehr effektive Programmierung von Filtern oder Reports gestattet. Mit Version 5 wurde es um die Möglichkeit objektorientierter Programmierung erweitert, die sich gut in das Konzept der Sprache einpasst.

Kenner schätzen an Perl neben den schon erwähnten Eigenschaften seine enorme Flexibilität. Typischerweise gibt es sehr viele mögliche Lösungsansätze für ein Problem, so dass jeder die ihm angenehmste Variante finden und verwenden kann. Hier wie auch an anderen Stellen merkt man dem Design die Anlehnung an natürliche Sprachen mit ihren reichen Formulierungsmöglichkeiten an. Viele Anweisungen und Befehle in Perl sind der englischen Sprache entlehnt, so zum Beispiel der Befehl my zur Variablenlokalisation. Viele boolsche Operatoren lassen sich auch durch die englischen Begriffe ersetzen, denen sie entsprechen, so zum Beispiel „||“ durch „or“ und „&&“ durch „and“. Dies ermöglicht zum einen einen sehr fließenden Programmierstil und verbessert die Lesbarkeit der Programme, zum anderen kann es aber falsch angewendet werden und den gegenteiligen Effekt verursachen.

Diese Flexibilität wird oft so verstanden, dass Perl dazu einlade, unübersichtlichen Quellcode zu schreiben. Sie gehen so weit zu behaupten, Perl sei die einzige Sprache, in der man „write-only“ programmieren könne. Tatsächlich bietet Perl nicht mehr oder weniger Möglichkeiten, unleserlichen Code zu produzieren, als andere Sprachen auch; Les- und Wartbarkeit eines Programms hängen in allen verbreiteten Sprachen vor allem vom Willen und Können seines Autors ab. Allerdings ermöglicht es Perl (scheinbar paradoxerweise) aufgrund seiner Flexibilität auch, besonders lesbaren Code zu schreiben.

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.

Datenstrukturen

Basisdatentypen in Perl sind skalare Variablen, Arrays und Hashes (assoziative Arrays). Daraus lassen sich beliebig neue Datenstrukturen erzeugen, zum Beispiel Hashes bestehend aus Arrays.

In einer skalaren Variable können Strings, Zahlenwerte oder Referenzen auf andere Daten gespeichert sein. Dasselbe gilt für alle Elemente der Array- und Hash-Datenstrukturen. Referenzen als Spezialfälle skalarer Variablen erlauben so die Konstruktion beliebig komplexer Datenstrukturen. Auch Objekte werden über Referenzen verwaltet.

Charakteristisch für Perl ist, dass Datentypen durch ein Prefix (oder auch Sigil genannt) angezeigt werden, hier einige Beispiele.

$ für Skalare: $scalar
@ für Arrays @array
% für Hashes/assoziative Arrays %hash 
& für Referenzen auf Funktionen &function
* für Typeglobs *alles

Während Arrays natürliche Zahlen als Index verwenden (die Zählung beginnt standardmäßig mit 0), werden Hash-Einträge über einen alphanumerischen Schlüssel („Key“) angesprochen (Key Value Paare). Hashes und Arrays lassen sich einander zuweisen.

Kontrollstrukturen

Die grundlegenden Kontrollstrukturen unterscheiden sich kaum von denen in C, Java und JavaScript:

If-Then-Else-Strukturen

if (<condition>) {
  <statements>
} elsif (<condition>) {
  <statements>
} else {
  <statements>
}

Negierte If-Then-Struktur:

unless (<condition>) {
  <statements>
}

Schleifen

While-Schleife:

while (<condition>) {
  <statements>
}


Do-While-Schleife:

do {
  <statements>
} while (<condition>);


For-Schleife:

for ([<start expression>]; [<condition>]; [<update statement>]) {
  <statements>
}


Foreach-Schleife, diese durchläuft Listen. $element ist eine Referenz auf das jeweilige Element:

foreach [ [my] $element] (<list>) {
  <statements>
}

Nachgestellte Kontrollstrukturen

Eine interessante Option in Perl sind nachgestellte Kontrollstrukturen, die es erlauben, die wesentliche Funktion eines Codefragments durch Voranstellen herauszuarbeiten, und die den (englischsprachigen) Lesern das Verständnis durch natürlichsprachige Formulierungen erleichtern:

doSomething() if $Bedingung;
  # Normal: if ($Bedingung) {doSomething();}

doSomething() unless $Bedingung;
  # Normal: unless ($Bedingung) {doSomething();}

loop() for @list;
  # Normal: foreach @list {loop();}

print while <STDIN>;
  # Normal: while(<STDIN>) {print;}

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.

Ein erster Entwurf könnte beispielsweise so aussehen:

while ($line = <STDIN>) {
  # bearbeite hier den Inhalt der Variable $line
  ...
  # ... und gib das Ergebnis aus
  print $line;
}

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:

while (<>) {
  # Die eingelesene Zeile steht in $_
  # Wir schieben ein <Tab> vor die Zeile ...
  $_ = "\t".$_;
  # .. und geben diese aus.
  print;
}

Anderes Beispiel: Einlesen einer Datei in ein Array von Zeilen. Dieses Beispiel ist aber speichertechnisch uneffizient, und sollte nur bei kleineren Dateien verwendet werden.

@meinArray = <STDIN>;

Noch ein Beispiel: Zählen von Wörtern und nach Häufigkeit (seltenste zuerst) ausgeben

ausführliche Version:

while ($zeile=<ARGV>) {
  @worte = split /\s+/, $zeile;
  foreach $wort (@worte)
   {$haeufigkeit{$wort}++;}
}

foreach $wort (reverse sort {$haeufigkeit{$a} <=> $haeufigkeit{$b}} keys %haeufigkeit) {
   print "$wort: $haeufigkeit{$wort}\n";
}

kurze Version:

map {$_{$_}++} split while <>;
print "$_: $_{$_}\n" for reverse sort {$_{$a} <=> $_{$b}} keys %_;

(Man beachte hierbei, dass der Skalar $_ und der Hash %_, auf dessen Elemente mit $_{schlüssel} zugegriffen wird, unterschiedliche Variablen sind!)

Diese vielen verschiedenen Lösungsansätze spiegeln ein von Perl-Programmierern gerne zitiertes Motto There's more than one way to do it (kurz: TMTOWTDI) wieder. Insbesondere die Möglichkeit, Programme kurz zu halten, wird von Perl-Hackern sehr geschätzt.


Spaß mit Perl

Viele Spracheigenschaften von Perl laden dazu ein Programmcode humor- oder kunstvoll zu gestalten. Dies hat zu verschiedenen teils humorvollen, teils skurrilen Wettbewerben und Aktionen um die Programmiersprache Perl geführt.

Wettbewerbe

Unter Perl-Programmierern haben sich einige Sportarten entwickelt, welche mittlerweile bei vielen Menschen Anklang gefunden haben, so zum Beispiel das Perlgolf, ein Wettbewerb dessen Ziel es ist eine gestellte Aufgabe mit einem möglichst kurzem Programm zu lösen. Eine andere Spielart ist zum Beispiel Poesie in Perl. Dabei geht es darum Gedichte zu schreiben die in Perl kompilierbar sind. Da Perl viele Elemente der englischen Sprache beinhaltet ist dies durchaus möglich, so erscheinen zum Beispiel regelmäßig neue Gedichte in der Perl Poetry-Kategorie des englischsprachigen Perl Monks-Forums.

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 worst C contest vergleichbar ist. Hier wird danach gestrebt auf ungewöhnliche und kreative Art und Weise die Funktion eines Programmes 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.

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 (Tim Toady)
  • ... 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)

Perligata

Das Perl-Modul Lingua::Romana::Perligata ist wohl eines der skurrilsten Module schlechthin, und demonstriert die offenkundige Selbstironie vieler Perlbenutzer. Es ermöglicht dem Benutzer, Perl komplett in Latein zu schreiben. 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. Ein bisschen Beispielcode:

insertum stringo unum tum duo excerpemento da.
             # Entspricht in Perl: substr($string,1,2) = $insert;

clavis hashus nominamentum da.
             # Entspricht:         @keys = keys %hash;

Dieses Perlmodul ist ein gutes Beispiel für den Zeitaufwand den viele Leute Perl widmen, Perl kann man diesem Sinne durchaus als Hobby bezeichnen.

Literatur

Konferenzen und Workshops

The Perl Conference ist ein großes, von O'Reilly ausgerichtetes, allerdings auch teures Treffen in Amerika. 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 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.

Termine

  • Der 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.

Vorlage:Wikibooks1 Vorlage:Wikibooks2