Open Source im professionellen Einsatz

© Bernd Lang, Pixelio.de

Stolperstellen für Perl-Eleven

Vorsicht, Falle!

Gerade das leicht erlernbare Perl, mit dem der Autor seine Informatik-Vorlesungen immer beginnt, weckt bei Studierenden Kreativität und Motivation. Was allerdings nicht vor Missverständnissen schützt, die zuweilen Schmunzeln lassen. Einige Perlen der Programmierirrtümer mit Perl stellt dieser Beitrag vor.

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.

Listing 1: Textumkehr,
Beispiellösung

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.

Listing 2: Gedanklich zu
lösen

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

Diesen Artikel als PDF kaufen

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook