Perl

Lesezeit: 8 Minuten

Perl ist eine plattformunabhängige, interpretierte, dynamisch typisierte Skriptsprache, die prozedurale, funktionale, aspektorientierte und seit Version 5 auch objektorientierte Programmierung unterstützt. Perl wurde 1987 von Larry Wall ins Leben gerufen. Die aktuelle Major-Version 5 gibt es bereits seit 1994, jedoch erscheinen weiterhin regelmäßig neue Aktualisierungen, zum Zeitpunkt dieses Beitrags zuletzt die Version 5.32 im Juni 2020.

Die Sprache hieß ursprünglich Pearl, bis Larry Wall entdeckte, dass es bereits eine Sprache dieses Namens gab. Perl wählte er, weil er auf der Suche nach einem kurzen, positiv besetzten Wort für seine neue Sprache war. Perl hat einige Backronyme, unter anderem Practical Extraction and Report Language.

Seit dem Jahr 2000 wird an Perl 6 gearbeitet, welches 2015 sein erstes offizielles Release erhielt und seit 2020 unter dem Namen Raku als Schwestersprache von Perl fortgeführt wird. Die geplante Version Perl 7 wird nicht auf Raku, sondern auf Perl 5 aufsetzen.

Alleinstellungsmerkmale

Larry Wall entwickelte die Sprache Perl in seiner Funktion als Administrator und Programmierer bei dem Unternehmen Unisys, wo er unter anderem für die Erstellung von Reports zuständig und mit den Möglichkeiten, die die vorhandenen Tools boten, nicht zufrieden war. Dementsprechend enthält Perl Einflüsse aus C, Shell Script und Werkzeugen wie Awk, Sed, Grep und Sort.

Perl war anfangs primär für Textverarbeitung konzipiert und hat native Unterstützung für reguläre Ausdrücke. Perl bietet viele unterschiedliche Möglichkeiten, das Gleiche zu erreichen und steht damit in starkem Kontrast zu der Sprache Python, wo es für ein Ziel meist den bevorzugten Pythonic Way gibt. Perl ist aber nicht nur vielseitig, sondern erlaubt es auch, Anweisungen sehr kompakt (und schwer lesbar) zu formulieren.

Charakteristische Zitate zur Sprache Perl sind There is more than one way to do it und Perl makes easy jobs easy and hard jobs possible.

Einsatzbereiche

Perl ist allgemein als Glue Language bekannt, also eine Sprache, die bevorzugt verwendet wird, verschiedene Programme miteinander zu verbinden. Die Sprache ist auf vielen unixoiden Betriebssystemen bereits installiert. Sie wird gerne für CGI-Skripte (Common Gateway Interface) verwendet und ist auch als duct tape of the internet bekannt. Im Comprehensive Perl Archive Network (CPAN) befinden sich knapp 200.000 Perl-Module. Perl ist auch in der Finanzbranche und der Bioinformatik verbreitet.

Perl ist eine gute Wahl für Aufgaben, bei denen Shell Script und Systemwerkzeuge wie Awk und Sed nicht ausreichend sind, eine Umsetzung in C jedoch zu weit gehen würde.

Amavis, Bugzilla, cPanel, Movable Type, Request Tracker (RT), SpamAssassin und Webmin sind in Perl geschrieben. Unter anderem setzen Booking.com, DuckDuckGo, IMDb, LiveJournal und Slashdot Perl intensiv in ihren Backends ein.

Pros

Perls Stärken liegen in der Textverarbeitung. Die in die Sprache eingebaute Unterstützung für reguläre Ausdrücke und Pattern Matching macht es sehr einfach, Informationen aus Textdateien zu extrahieren und Reports aufzubereiten. Mit den File-Test-Operatoren kann sehr leicht überprüft werden, ob eine Datei existiert, um welche Art Datei es sich dabei handelt (reguläre Datei, Verzeichnis, Queue, Verknüpfung…) und wie auf diese mit den gegebenen Rechten zugegriffen werden kann.

Die folgende Zeile Code führt zu einer Ausgabe, wenn eine Datei test.sh im aktuellen Verzeichnis existiert:

if (-e "test.sh") { print "file exists\n"; }

Perl setzt keine Grenze für die Größe von Datenstrukturen und die Rekursionstiefe. Native Unterstützung für Arrays und Hashes (Assoziative Arrays) ist vorhanden. Perl ist in verschiedene Programme einbettbar, so kann über das Modul mod_perl ein Perl-Interpreter in den Webserver Apache Tomcat eingebettet werden. Für die relationale Datenbank PostgreSQL gibt es die Erweiterung PL/Perl, um PostgreSQL-Funktionen in Perl zu schreiben.

Die ersten Schritte in der Sprache fallen leicht, insbesonderes wenn man mit den gängigen Werkzeugen der Unix-Welt bereits vertraut ist. Perl ist einfach erweiterbar. Wie auch Python und Ruby unterstützt Perl Monkeypatching.

Cons

Perl hat einige Eigenheiten, die Entwicklern, die von moderneren Sprachen wie Python und Ruby kommen, den Einstieg erschweren. Beispielsweise übernimmt Perl die Besonderheit von Shell Script, numerische Werte anders miteinander zu vergleichen wie Zeichenketten:

$a="foo";
$b=1;
# Beide Bedingungen sind syntaktisch korrekt und "true"
# $a ist eine Zeichenkette und $b eine Zahl
if ($a = $a) { print "$a\n"; }
if ($b eq $b) { print "$b\n"; }

Auch die Umsetzung von objektorientierter, klassenbasierter Programmierung wirkt gewöhnungsbedürftig. Ein typischer Konstruktor für eine Klasse mit einem uninitialisiertem Feld könnte etwa so aussehen:

sub new {
    my $class = shift;
    my $self = { my_field => undef };
    bless($self, $class);
    $self;
}

Perl wirkt auf mich sehr konservativ in der Einführung neuer Features. Beispielsweise bin ich auf der Suche nach switch/case zunächst über eine Bibliothek gestolpert, die ein solches Konstrukt ermöglichen soll, jedoch ist sie kein Kernbestandteil der Sprache und von der Nutzung wurde mir von verschiedenen Stellen abgeraten. Ein natives Äquivalent dafür ist das in der mehr als zehn Jahre alten Version Perl 5.10 eingeführte given/when, was jedoch selbst in der aktuellen Version Perl 5.32 immer noch als experimentell eingestuft wird und explizit aktiviert werden muss.

Perls Flexibilität kann je nach Sichtweise ein Pro oder Contra sein. Schreibt man große Anwendungen zusammen mit anderen Entwicklern, einigt man sich üblicherweise auf einen bestimmten Programmierstil und Style Guide, wo ich die Flexibilität eher kritisch sehe und mir stattdessen allgemein anerkannte Best Practices wünsche.

Ein konkretes Beispiel dafür ist die fehlende Signatur in Funktionen. Während andere dynamisch typisierte Programmiersprachen Platzhalter für die Parameter einer Funktion vorsehen, werden in Perl die Argumente im Body ausgelesen. Perl bietet dafür das implizite Array @_ an, alternativ können die Argumente über die Funktion shift ausgelesen werden, dabei werden sie auch zeitgleich aus dem Array entfernt. Der folgende Code verdeutlich, auf welch verschiedene Art und Weise die Argumente ausgelesen werden können:

sub test1 {
	$a=shift;
	$b=shift;
	print "$a, $b\n";
}

sub test2 {
	($a, $b)=@_;
	print "$a, $b\n";
}

sub test3 {
	$a=$_[0];
	$b=$_[1];
	print "$a, $b\n";
}

sub test4 {
	$a=shift;
	$b=$_[0];
	print "$a, $b\n";
}

# Ausgabe: 4x "foo, bar"
test1("foo", "bar");
test2("foo", "bar");
test3("foo", "bar");
test4("foo", "bar");

Perl liefert eine Vielzahl vordefinierter Variablen wie @_, vertreten sind häufig verwendete Variablen wie $_, die Zugriff auf das aktuelle Element einer For-Each-Schleife geben, als auch solche wie $[, mit denen der Index des ersten Elementes eines Arrays geändert werden kann. Eine Auflistung der Variablen ist am Ende des Beitrags verlinkt.

Aufgrund seiner Flexibilität kann Perl-Code sehr schwer lesbar und zu debuggen sein, und es erfordert sehr viel Zeit, ein wirklich tiefes Verständnis für die Sprache aufzubauen.

Datenblatt

NamePerl
Webseitehttps://www.perl.org
Erscheinungsjahr1987
Aktuellste Version (Stand 6. Juni 2021)Version 5.35 vom 21. Mai 2021
Typisierungdynamisch
Paradigmenimperativ
prozedural
objektorientiert
funktional
aspektorientiert
ProsCons
einfacher Einstiegeigentümliche Syntax für Entwickler, die von anderen, moderneren Sprachen kommen
extrem flexibelPerl-Code kann schnell schwer zu verstehen und zu debuggen sein
eingebaute reguläre Ausdrücke und Pattern Matchingsehr viel Zeit notwendig um ein tiefes Verständnis für die Sprache aufzubauen
gute Unterstützung für Textverarbeitung und -formatierungeher keine gute Wahl, um im Team große Systeme zu entwickeln
eingebaute Arrays und Hashes
keine Größenbeschränkung für Daten und Rekursionen
Unterstützung für Monkeypatching
einbettbar

virtuallet

virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Perl-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.

- Vordefinierte Variablen in Perl