Dieser Beitrag präsentiert ein paar bemerkenswerte und zuweilen amüsante Stolperstellen, Missverständnisse und besonders "kreative" Lösungsansätze von Studierenden für Perl-Aufgaben.
Ohne zu rechnen
Wenn ich in die Grundlagen von Perl einführe, erläutere ich unter anderem die Funktion »reverse()« ausführlich und anhand von Beispielen. Diese Funktion dreht im Listenkontext die Reihenfolge der Elemente eines Array um. Im Skalarkontext verkettet sie alle Zeichen und liefert sie einzeln in umgekehrter Reihenfolge zurück.
Aufbauend auf dieser Perl-Funktion sollten vor ein paar Jahren die Studenten als einfache Aufgabe ein Perl-Programm realisieren, das vier Textzeilen einliest und sie dann in umgekehrter Reihenfolge, außerdem mit jeweils umgedrehtem Textinhalt, wieder ausgibt.
Die vierzeilige Eingabe für dieses Übungsprogramm lautete:
Na klar,
Perl
ist
spitze!
Als Ausgabe hatte ich vorgesehen:
!eztips
tsi
lreP
,ralk aN
Natürlich ging ich davon aus, dass die Probanden die eben behandelte Funktion »reverse()« verwenden würden. Das führte dann zu einem Programm, wie in Listing 1. Stattdessen lieferten einige aber eine besonders findige Lösung, die nur aus einer einzigen Zeile bestand:
print "!eztipsntsinlrePn,ralk aN";
Im nächsten Beispiel sollte Perls Wiederholungsoperator »x« Zeichen vervielfachen. Dabei galt es, die folgende Darstellung zu verdoppeln:
****************
* Perl *
* doppelt *
* sehen *
****************
Mit einem »HERE«-Dokument und dem Wiederholungsoperator »x« ließe sich diese Aufgabe wie folgt lösen:
$Dokument = <<TOKEN
****************
* Perl *
* doppelt *
* sehen *
****************
TOKEN
x 2;
print "ntHERE-Dokument: n", $Dokument, "n";
Statt den vorhandenen »x«-Operator zu verwenden, realisierten aber auch hier einige Studenten die Aufgabe - recht mühsam - nur mit »print«-Anweisungen.
01 for ($i = 1; $i <= 4; $i++) { # for-Schleife
02 print "$i.Text: ";
03 $Text = <STDIN>; # Text-Eingabe
04 $Satz .= $Text; # Verkettung der Zeichen
05 }
07 $Satz_gedreht = reverse $Satz; # mit reverse drehen
08 print "$Satz_gedrehtn"; # Ausgabe
|
Klein und gemein
Nach meinem Motto "Perl - klein, aber gemein" verführten die folgenden Aufgaben Studenten dann zu falschen Ergebnissen, wenn sie Vorrangregeln, Aliases und Klammern in Perl nicht berücksichtigten. Bei den auf einige Zeilen beschränkten Perl-Programmen in Listing 2 war die Voraussage der richtigen Ergebnisse gefragt, die hier ausnahmsweise hinter dem Kommentarzeichen folgen.
01 $a = 5;
02 $b = 7;
03 print $b + $a * ++$b; # 48
04 #***********************************
05 @a = 1 .. 3;
06 for (@a) {print $_ *= 2 + $_;}
07 print "@a"; # 3 8 15
08 #***********************************
09 $a = 1;
10 $a % 2 ? $a += 10 : $a += 2;
11 print "$a"; # 13
|