Übung zum Modul Einführung in die Programmierung WiSe 2011/12

Tipps für die Klausur

Variablendeklaration
Es können mehrere Variablen gleichzeitig mit "my" deklariert werden, indem man sie in Klammern und mit Kommas getrennt angibt! Beispiel:

my ($a, $b, $c);

Wenn Sie bei einer Aufgabe zu Beginn noch nicht wissen, wieviele Hilfsvariablen (z.B. "$wort", "$element") Sie benötigen werden, können Sie sie so am Ende in eine Zeile schreiben!

Schleifen
Hier nochmal kurz zusammengefasst, wie die verschiedenen Schleifen funktionieren und wofür sie am besten geeignet sind:

for-Schleife

Verlangt 2 Anweisungen, was bei Schleifeneintritt und nach jedem Durchgang passieren soll sowie eine Bedingung, unter der die Schleife weiterläuft. Theoretisch kann man beliebige Anweisungen und Bedingungen angeben, der üblichste Fall ist aber, dass man eine Index-Variable (meist "$i" genannt) numerische Werte durchlaufen lässt. Die for-Schleife ist am besten geeignet, wenn man eine Reihe von Zahlen ausgeben möchte.

Beispiel:
for (my $i=0; $i < 10; $i++) {
  (...)
}

while-Schleife

Diese Schleife verlangt nur eine einzige Bedingung, die erfüllt sein muss, damit die Schleife weiterläuft. Sollen numerische Werte durchlaufen werden, muss man die Index-Variable in dem Programmblock der Schleife manuell hochzählen. Bei while-Schleifen kann man sich aber auch zunutze machen, dass Lese-Operationen "false" zurückliefern und damit zum Abbruch der Schleife führen, wenn keine Elemente mehr übrig sind (also wenn man am Ende der Datei angelangt ist). Deswegen wird die while-Schleife vor allem zum zeilenweisen Einlesen von Dateien benötigt.

Beispiel:
while ($zeile = <DATEI>) {
  (...)
}

foreach-Schleife

Wie der Name schon sagt, sieht die foreach-Schleife für jedes Element einer Liste einen Schleifendurchgang vor. Die Elemente werden dabei jeweils in einer Variable zwischengespeichert, die man vor der Klammer angeben kann (oder man verwendet die Systemvariable "$_"). Man kann Listen auch mit for-Schleifen durchlaufen, dies ist jedoch wesentlich umständlicher und höchstens dann sinnvoll, wenn man zu den Elementen einen Index ausgeben möchte.

Beispiel:
foreach my $elem (@elemente) {
  print "$elem\n";
}

Der gleiche Programmteil mit einer for-Schleife:
for (my $i=0; $i < scalar(@elemente); $i++) {
  print "$elemente[$i]\n";
}

Reguläre Ausdrücke:
Die größten Fallen im Überblick:


Zeichen haben andere Bedeutungen, wenn sie in Buchstabenklassen stehen, die eine Menge von möglichen Zeichen angeben! So steht das Zeichen "^" normalerweise für den Anfang eines Strings, in einer Buchstabenklasse steht es aber für "nicht"! Wird ein Fragezeichen einem Teilausdruck nachgestellt, bedeutet es "optional", wird es einem Quantifikator nachgestellt, macht es aus einem gierigen Ausdruck einen nicht gierigen.

Beispiel:
/^[^abc]/

matcht auf alle Strings, die nicht mit a, b oder c anfangen

/\w+(\.)? \w+/

matcht auf zwei mit einem Leerzeichen getrennten Wörter, wobei nach dem ersten noch ein Punkt folgen kann

/und.+?und/

matcht auf den Teil zwischen dem ersten und dem zweiten Vorkommen von "und" - ohne das Fragezeichen wären es das erste und das letzte Vorkommen!



Zeichen, die innerhalb von regulären Ausdrücken eine besondere Bedeutung haben, müssen "escaped" werden, wenn sie in ihrem ursprünglichen Sinn verwendet werden sollen! Dazu wird ein Backslash ("\") vorangestellt.

Beispiel:
/^...$/

matcht alle Strings, die aus 3 beliebigen Zeichen bestehen

/^\.\.\.$/

matcht auf den String "..."



Der Unterschied zwischen den beiden Quantifikatoren "*" und "+" ist wichtig! Beim Stern kann es auch ein leerer String sein, der gematcht wird, beim Plus muss es mindestens ein Zeichen sein!


Die Metazeichen "^" und "&" matchen bekanntlich auf Anfang und Ende des Strings. Ob und wie man sie einsetzt, hängt zunächst einmal davon ab, ob man mit einem längeren Text arbeitet, der aus mehreren Wörtern besteht oder mit einem String, der schon genau ein Wort enthält (zum Beispiel aus einer Liste, die mit split erzeugt wurde). Liest man Zeilen aus einer Datei ein, kann es zum Beispiel erwünscht sein, Strings am Anfang der Zeile zu finden. Bei einzelnen Wörtern dagegen braucht man diese Metazeichen, wenn nicht erwünscht ist, dass nur ein Teilstring des Wortes gematcht wird.

Beispiel:
/ung$/

matcht nur auf Wörter mit "ung" am Ende, wie "Zeitung" und "Kleidung"

/ung/

matcht auf "Zeitung" und "Kleidung", aber z.B. auch auf "hungrig"!


Häufige Fehler

Deklaration vergessen
Alle verwendeten Variablen müssen vorher mit "my" deklariert werden! Deklarieren Sie am besten alle Variablen am Anfang des Programms. Hilfsvariablen, die Sie nur innerhalb einer Schleife brauchen, können Sie auch lokal deklarieren.

my ($elem, @woerter, %hash);

foreach my $wort (@woerter) {
  (...)
}

Klammern vergessen
Achten Sie darauf, dass Sie alle Klammern, die Sie aufmachen, auch wieder schließen! Schreiben Sie schließende Klammern am besten auf eine Höhe mit dem Beginn des Programmblocks (so wie in den Musterlösungen zu den Hausaufgaben), dann übersehen Sie nicht so schnell etwas:

if (a == b) {
  foreach c (@d) {
    if (e == f) {
      (...)
    }
  }
}

Klammern falsch gesetzt
Werden Klammern falsch gesetzt, kann das das Programm unbrauchbar machen, aber auch einfach nur den Sinn verändern! Hier gut aufpassen!
close() vergessen
Alle geöffneten Filestreams müssen auch wieder geschlossen werden!
Falscher Variablentyp
Skalare Variablen beginnen mit einem Dollarzeichen, Listen mit einem @ und Hashes mit dem Prozentzeichen. Wird auf das Element einer Liste oder eines Hashes zugegriffen und dieses ist eine skalare Variable, muss man - entgegen der Intuition - auch ein Dollarzeichen voranstellen!

my $elem;
my @liste = ("A", "B", "C");
my %hash = ("A", 22, "B", 7, "C", 15);

print "$elem\n";
print "$liste[0]\n";
print "$hash{'A'}\n";

­