Steckbrief
image: perl-logo.png kind: steckbrief curriculum: "Sek I: Geschichte der Informatik (Lebensläufe und Leistungen bedeutender Persönlichkeiten); Oberstufe: Algorithmen und Softwareentwicklung (ein Skript ausführen, Fehlermeldungen lesen, Zeichenketten und Zahlen, Bubblesort ändern)" topics: [programmiersprachen, geschichte]

Perl (1987)

Perl entstand 1987, als Larry Wall bei einer Firma in Kalifornien Berichte aus vielen Textdateien zusammenstellen musste und die Werkzeuge dafür zu umständlich fand. Perl ist eine Skriptsprache, die besonders gut mit Text umgehen kann: Zeilen lesen, Muster darin finden, umbauen und ausgeben. In den 1990er Jahren liefen große Teile des frühen Webs mit Perl, weil Webserver damit Seiten erzeugen konnten, und Systemadministratoren schrieben ihre Werkzeuge damit. Bis heute ist Perl auf fast jedem Linux-System installiert, auch in deinem Workspace.

Larry Wall 2007: ein Mann mit langem rotblondem Haar, Brille und Schnurrbart in einem hellen T-Shirt, die Arme verschränkt.

Larry Wall (geboren 1954), amerikanischer Programmierer, hat Sprachwissenschaft studiert. 1987 veröffentlichte er Perl, weil er Berichte aus vielen Textdateien zusammenstellen musste und die Werkzeuge dafür zu umständlich fand. Man merkt Perl seine Sprachwissenschaft an: Wie in einer natürlichen Sprache gibt es für fast alles mehrere Arten, es zu sagen (»There's more than one way to do it«), und Variablen tragen ein Zeichen vor dem Namen, das wie ein Artikel sagt, was gemeint ist: $ für einen einzelnen Wert, @ für eine Liste.

Vor Perl hatte er schon patch geschrieben, das Programm, das Änderungen an Dateien einspielt und das es bis heute auf jedem Linux-System gibt. Aus seinem Plan für ein Perl 6 wurde eine eigene Sprache, die seit 2019 Raku heißt.

Foto: Randal Schwartz, 2007, CC BY-SA 2.0, zugeschnitten (Wikimedia Commons)

1. Hello, world!

Lege mit StrgAltN eine neue Datei an und schreib hinein:

use strict;
use warnings;

print "Hello, World!\n";

Speichere sie mit StrgS als /workspace/hello.pl. Die ersten beiden Zeilen schalten Prüfungen ein: use strict verlangt, dass du jede Variable mit my anlegst, bevor du sie benutzt, und use warnings warnt bei Verdächtigem. Jede Anweisung endet mit einem Semikolon, und \n ist ein Zeilenumbruch.

Visual Studio Code kennt Perl schon und zeigt das Programm farbig, sobald die Datei mit der Endung .pl gespeichert ist:

hello.pl im Editor mit farbiger Syntax: use strict, use warnings und print mit dem Text Hello, World!.

Skript ausführen

Öffne ein Terminal mit StrgJ und führe das Skript aus:

perl hello.pl

Im Terminal gibt perl hello.pl die Zeile Hello, World! aus.

Aufgabe 1Hello, World!

Speichere dein erstes Skript als /workspace/hello.pl und führe es mit perl hello.pl aus.

Tipp

Ein weißer Punkt am Reiter der Datei heißt, dass sie noch nicht gespeichert ist.

Fehler finden und beheben

Schreib in hello.pl statt print einmal pritn, speichere und führe das Skript wieder aus. Lies, was Perl meldet:

Aufgabe 2Wo ist der Fehler?

In welcher Zeile von hello.pl findet Perl den Fehler? Die Zahl steht in der Meldung hinter line.

Tipp

Die Meldung endet mit at hello.pl line …, near ….

Hier geht es weiter, sobald du deine Antwort oben abgegeben hast.

perl meldet: String found where operator expected (Do you need to predeclare »pritn«?) at hello.pl line 4, dann syntax error at hello.pl line 4 und Execution of hello.pl aborted due to compilation errors.

Perl liest erst das ganze Skript, bevor es etwas ausführt. Ein Wort, das es nicht kennt, gefolgt von einem Text, kann es nicht lesen, und so bricht es ab, bevor die erste Zeile läuft. Denk daran, den Fehler wieder zu beheben.

2. Primfaktorzerlegung

Im zweiten Beispiel zerlegt Perl eine Zahl in ihre Primfaktoren. <STDIN> liest eine Zeile, die du eintippst, mit dem Zeilenumbruch am Ende, und chomp schneidet ihn ab. @factors ist eine Liste, push hängt etwas an. Erstelle eine neue Datei factor.pl:

use strict;
use warnings;

print "Please enter the number to factorise:\n";
my $number = <STDIN>;
chomp $number;

# try every divisor from 2 on; a divisor that fits is a prime factor
my @factors;
my $divisor = 2;
while ($number > 1) {
    if ($number % $divisor == 0) {
        push @factors, $divisor;
        $number /= $divisor;
    } else {
        $divisor++;
    }
}
print "Prime factors: @factors\n";

perl factor.pl fragt nach einer Zahl und gibt für 360 die Primfaktoren 2 2 2 3 3 5 aus.

Ein Text, der wie eine Zahl aussieht, ist für Perl eine Zahl, sobald man mit ihm rechnet. Darum kann $number % $divisor rechnen, obwohl <STDIN> einen Text gelesen hat.

Vermutung 3Drei und vier

Was gibt print "3" + "4"; aus? Überleg erst, dann probier es aus: perl -e 'print "3" + "4", "\n"' im Terminal.

Drei und vier

Hier geht es weiter, sobald du deine Antwort oben abgegeben hast.

Ausprobieren: Perl kann ein Programm auch direkt aus dem Terminal nehmen: perl -e 'print "3" . "4", "\n"'. Probier auch "3" x 4 und "3" * "4" und achte darauf, wann Perl rechnet und wann es mit Text arbeitet.

3. Bubblesort

Im dritten Beispiel sortiert Perl eine Liste von zehn Zufallszahlen mit Bubblesort. Die Liste heißt @list, ein einzelnes Element darin $list[$i]: Es ist ein einzelner Wert, darum das $. $#list ist der Index des letzten Elements, und @list[$i, $i + 1] = @list[$i + 1, $i] vertauscht zwei Nachbarn in einem Schritt.

use strict;
use warnings;

my @list = map { int(rand(100)) } 1 .. 10;
print "Original list: @list\n";

# swap neighbours in the wrong order until a pass swaps none
my $sorted = 0;
until ($sorted) {
    $sorted = 1;
    for my $i (0 .. $#list - 1) {
        if ($list[$i] > $list[$i + 1]) {
            @list[$i, $i + 1] = @list[$i + 1, $i];
            $sorted = 0;
        }
    }
}
print "Sorted list: @list\n";

Speichere es als bubblesort.pl und führe es aus:

perl bubblesort.pl gibt eine Liste von zehn Zufallszahlen aus und darunter dieselbe Liste sortiert.

Ausprobieren: Sortiere 100 Zahlen statt 10. Perl hat dafür auch ein eingebautes sort: Schreib my @sorted = sort { $a <=> $b } @list; und gib @sorted aus. Achte darauf, was passiert, wenn du nur sort @list schreibst und eine Zahl unter 10 dabei ist.
Aufgabe 4Die größte zuerst

Ändere bubblesort.pl so, dass die größte Zahl zuerst kommt, und starte das Skript noch einmal.

Tipp

Die Zeile, die entscheidet, steht in der inneren Schleife: if ($list[$i] > $list[$i + 1]).

Nächster Tipp

Ein einziges Zeichen in dieser Zeile entscheidet, wann zwei Nachbarn vertauscht werden.

4. Zusammenfassung

Du hast an drei Beispielen gesehen, wie ein Perl-Skript aussieht und wie du es ausführst. Seine Stärke zeigt Perl bei Text: Mit regulären Ausdrücken, die in Perl so selbstverständlich sind, dass sie später in fast alle anderen Sprachen übernommen wurden, findet und ersetzt es Muster in jeder Zeile einer Datei. Wie reguläre Ausdrücke funktionieren, zeigt die Aktivität Reguläre Ausdrücke. Die Dokumentation zu Perl findest du unter perldoc.perl.org.

Programming Perl, Larry Wall, Tom Christiansen und Randal L. Schwartz, O'Reilly, 1991, nach dem Tier auf dem Umschlag »das Kamelbuch«. Das Buch, das Larry Wall selbst über seine Sprache geschrieben hat, mit vielen Beispielen und Witz; seitdem ist das Kamel das Zeichen von Perl.