Programmierkurs für absolute Anfänger erste Perl-Programme Caren Brinckmann Sommersemester 2005 http://www.coli.uni-saarland.de/~cabr/teaching.php Perl Entwickler: Larry Wall backronyms: Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister ursprüngliches Anwendungsgebiet: Textdateien durchforsten und bearbeiten Informationen gewinnen und Berichte erstellen Philosophie: there's more than one way to do it (TMTOWTDI) make easy tasks easy and difficult tasks possible WWW: www.perl.com Programmierkurs für absolute Anfänger – Sitzung 2 1 Unser erstes Programm START Ausgabe: Hallo Welt! Erstelle eine Datei mit dem Namen HalloWelt.pl und folgendem Inhalt: # Ausgabe: "Hallo Welt!" print "Hallo Welt!\n"; STOP Dieses Programm wird ausgeführt mit folgendem Befehl: perl HalloWelt.pl Programmierkurs für absolute Anfänger – Sitzung 2 2 Grundaufbau eines Programms Ein Programm besteht aus einer Abfolge von Anweisungen (statements). Die Anweisungen werden in der Reihenfolge, in der sie im Programmtext auftauchen, ausgeführt. Im einfachsten Fall enthält das Programm keine Schleife und keine bedingte Verzweigung linearer Kontrollfluss. Nach Abarbeitung der letzten Anweisung endet das Programm. Das Programm HalloWelt.pl besteht aus nur einer einzigen Anweisung. Diese Anweisung ruft die eine Ausgabefunktion mit einem bestimmten Argument auf, nämlich einer Zeichenkettenkonstanten. Programmierkurs für absolute Anfänger – Sitzung 2 3 Zeichenketten Zeichenkettenkonstante Hallo Welt!\n ändert ihren Wert nicht. Zeichenkette (String) ensteht, indem einzelne Zeichen in Anführungszeichen " eingeschlossen werden. \n kodiert ein einziges Zeilentrennzeichen (newline) die aktuelle Zeile wird beendet, und eine neue wird begonnen. Backslash \ entwertet das nachfolgende Zeichen und gibt ihm eine spezielle Bedeutung. Wenn ein Backslash oder Anführungszeichen ausgegeben werden sollen, so müssen sie selbst "entwertet" werden: \\ bzw. \" Programmierkurs für absolute Anfänger – Sitzung 2 4 Benutzung von eingebauten Funktionen Um eine Funktion aufzurufen, wird ihr Name hingeschrieben. Ausgabefunktion print erhält die auszudruckende Zeichenkette als Argument In den meisten Programmiersprachen müssen die Argumente von Funktionen in Klammern gesetzt werden, z.B. print("Hallo Welt!\n"); In Perl sind die Klammern fakultativ! Programmierkurs für absolute Anfänger – Sitzung 2 5 Trennung von Anweisungen Jede Anweisung muss mit einem Semikolon ; abgeschlossen werden. Eine Anweisung kann in einer Zeile stehen oder über mehrere Zeilen verteilt werden. Es können prinzipiell auch mehrere durch ; getrennte Anweisungen in einer Zeile stehen. Guter Programmierstil: Jede Anweisung in einer eigenen Zeile. Programmierkurs für absolute Anfänger – Sitzung 2 6 Leerraum Der Perl-Interpreter zerlegt das Programm zunächst in kleinste syntaktische Einheiten: Tokens. Im Programm HalloWelt.pl sind das die drei Tokens print, "Hallo Welt!\n" und ; Vor und hinter jedem Token ist beliebig viel Leerraum (whitespace) erlaubt: Leerzeichen, Zeilentrennzeichen und Tabulatorzeichen. Leerraum kann ganz ausgespart werden, es sei denn, die beiden Tokens ergeben aneinandergeschrieben ein neues Token. Guter Programmierstil: Die einzelnen Tokens durch ausreichend Leerraum leicht erkennbar machen! Programmierkurs für absolute Anfänger – Sitzung 2 7 Kommentare In Perl beginnt jede Kommentarzeile mit einem # Der Perl-Interpreter ignoriert alle Kommentarzeilen. Mit Kommentaren macht man das Programm für andere und für sich selbst (!) lesbarer. Sinnvoll: Mehrere Kommentarzeilen zu Beginn des Programms, die beschreiben Name und e-mail des Programmierers welche Eingabedaten das Programm benötigt was das Programm macht wie das Format der Ausgabe aussieht typischer Programmaufruf (ggf. mit den benötigten Argumenten) Versionsnummer (bei Programmen, die man mehrfach verändert) Außerdem: Kommentar zu Beginn jedes Anweisungsblocks! Jede Zeile kommentieren, die sich nicht von selbst erklärt. Programmierkurs für absolute Anfänger – Sitzung 2 8 Fehler und Warnmeldungen Syntaktische Fehler, etwa der Tippfehler prinnt, werden vom Interpreter direkt beim Aufruf erkannt. Der Interpreter gibt eine oder mehrere Fehlermeldungen mit Angabe der Zeilennummer aus, in der er den Fehler bemerkt hat. Semantische Fehler kann der Interpreter nicht erkennen! Beispiel: Das Programm soll "Hallo Welt!" ausgeben, gibt aber "Hello world!" aus. Häufig sind die ausführlichen Warnungen des Interpreters hilfreich bei der Fehlersuche: perl -w HalloWelt.pl Programmierkurs für absolute Anfänger – Sitzung 2 9 Variablen (1) Variable: Speicherplatz für veränderliche Werte eindeutiger Name (Bezeichner) Variable erhält ihren Wert über Zuweisungen Programm kann über den Bezeichner auf den jeweiligen Wert zugreifen Bezeichner sinnvollen Bezeichner wählen, z.B. eurobetrag statt zahl Bezeichner muss mit einem Buchstaben oder _ anfangen deutsche Sonderzeichen dürfen nicht vorkommen Groß- und Kleinschreibung wird unterschieden Programmierkurs für absolute Anfänger – Sitzung 2 10 Variablen (2) skalare Variable: kann nur einen einzigen Wert speichern Wert: eine Zahl oder eine Zeichenkette beginnt in Perl stets mit $ Beispiele: $zaehler $eingabezeile $zaehler2 $vokal_1 Variablen in Perl sind ungetypt, d.h. sie können zu einem bestimmten Zeitpunkt eine Zahl und zu einem anderen Zeitpunkt eine Zeichenkette enthalten. Variablen in Perl müssen nicht deklariert werden, d.h. sie entstehen genau in dem Moment, in dem ihnen zum ersten Mal ein Wert zugewiesen wird. Programmierkurs für absolute Anfänger – Sitzung 2 11 Literale Literal: konstantes Objekt Stringliterale: kodieren konstante Strings (Zeichenketten) Perl: gebildet durch Einschließen von Zeichen in einfache oder doppelte Anführungszeichen Beispiele: "Hallo Du" 'Hallo' numerische Literale: ganze Zahlen, z.B. -255 Dezimalzahlen, z.B. 1.609 Programmierkurs für absolute Anfänger – Sitzung 2 12 Zuweisungen Zuweisungen von Werten an Variablen erfolgen durch den Zuweisungsoperator = Die Variable auf der linken Seite des Zuweisungsoperators erhält den Wert auf der rechten Seite. Was darf auf der rechten Seite stehen? Literal: $zaehler = 1; Variable: $zaehler1 = $zaehler2; komplexer Ausdruck: $kilometer = $meilen * 1.609; Programmierkurs für absolute Anfänger – Sitzung 2 13 Beispiel: Zuweisungen $x=42; print "$x\n"; $x="Gandalf der Graue"; print "Jetzt ist x gleich $x\n"; $Zauberer_Nr_1 = $x; print "$Zauberer_Nr_1\n"; $Zauberer_Nr_1 = "Gandalf der Weiße"; print "$Zauberer_Nr_1\n"; Programmierkurs für absolute Anfänger – Sitzung 2 14 Arithmetische Ausdrücke Arithmetische Ausdrücke setzen sich zusammen aus: Zahlenkonstanten numerische Variablen arithmetische Operatoren: + - * / Modulo-Operator % berechnet den ganzzahligen Rest einer ganzzahligen Division, z.B. 9 % 2 = 1 runde Klammern Präzedenz $x = 1; $y = 2; $mittelwert = ($x + $y) / 2; print "Mittelwert von x und y: $mittelwert\n"; Programmierkurs für absolute Anfänger – Sitzung 2 15 Konkatenation von Zeichenketten Konkatenation: Aneinanderhängen von zwei Zeichenketten Konkatenationsoperator: . $vorname = "Caren"; $nachname = "Brinckmann"; $name = $vorname . " " . $nachname; Konkatenation durch Substitution in Stringliteralen: $name = "$vorname $nachname"; Programmierkurs für absolute Anfänger – Sitzung 2 16 Standardeingabe und -ausgabe Skalare Variablen können ihre Werte zur Laufzeit des Programms aus der Standardeingabe beziehen. Normalfall: Programm wartet auf eine Eingabe durch den Benutzer (Ende: Return-Taste) Der Inhalt der Eingabezeile wird in einen speziellen Eingabestrom – die Standardeingabe STDIN – geschrieben. Das Programm kann diesen Eingabestrom Zeile für Zeile lesen und den Inhalt einzelner Zeilen in Variablen abspeichern. Die print Funktion sendet die auszugebenden Daten an die Standardausgabe STDOUT. Programmierkurs für absolute Anfänger – Sitzung 2 17 Beispiel: Eingabe lesen ## Programm, dass die Eingabezeile des ## Benutzers auf dem Bildschirm ausgibt print "Deine Eingabe: "; $eingabezeile = <STDIN>; print "Ich wiederhole: $eingabezeile"; Achtung: Das Zeilentrennzeichen \n gehört mit zu den eingegebenen Zeichen (verursacht durch das Drücken der Return-Taste). Programmierkurs für absolute Anfänger – Sitzung 2 18 Funktion chomp chomp schneidet das letzte Zeichen einer Zeichenkette ab, wenn es ein Zeilentrennzeichen ist, ansonsten lässt sie die Zeichenkette unverändert. print "Name: "; $name = <STDIN>; chomp $name; print "Alter: "; $alter = <STDIN>; chomp $alter; $maximalpuls = 220 - $alter; print "Maximalpuls von $name beträgt $maximalpuls.\n"; Programmierkurs für absolute Anfänger – Sitzung 2 19 Funktion length length bestimmt die Anzahl der Zeichen eines Strings (seine Länge) und gibt diesen Wert zurück. print "Vorname: "; $vorname = <STDIN>; chomp $vorname; print "Nachname: "; $nachname = <STDIN>; chomp $nachname; $laenge_name = length($vorname) + length($nachname); print "Dein Name hat $laenge_name Buchstaben.\n"; Programmierkurs für absolute Anfänger – Sitzung 2 20 Bedingte Anweisungen if Anweisung wird ausgeführt, wenn eine Bedingung erfüllt ist if – else zwei Alternativen if – elsif – else mehr als zwei Alternativen Programmierkurs für absolute Anfänger – Sitzung 2 21 if Syntax: if (Ausdruck) { Anweisungsblock } $vorname = <STDIN>; chomp $vorname; $nachname = <STDIN>; chomp $nachname; $laenge_vorname = length($vorname); $laenge_nachname = length($nachname); if ($laenge_vorname > $laenge_nachname) { print "Vorname ist länger als Nachname.\n"; } Programmierkurs für absolute Anfänger – Sitzung 2 22 if – else Syntax: if (Ausdruck) { Anweisungsblock_1 } else { Anweisungsblock_2 } if ($laenge_vorname > $laenge_nachname) { print "Vorname ist länger als Nachname.\n"; } else { print "Vorname ist nicht länger als Nachname.\n"; } Programmierkurs für absolute Anfänger – Sitzung 2 23 if – elsif – else Syntax: if (Ausdruck_1) { Anweisungsblock_1 } elsif (Ausdruck_2) { Anweisungsblock_2 } elsif (Ausdruck_3) { Anweisungsblock_3 ... } else { Anweisungsblock_default } else-Block ist fakultativ! Programmierkurs für absolute Anfänger – Sitzung 2 24 Beispiel: if – elsif – else if ($laenge_vorname > $laenge_nachname) { print "Vorname ist länger als Nachname.\n"; } elsif ($laenge_vorname == $laenge_nachname) { print "Vor- und Nachname sind gleich lang.\n"; } else { print "Nachname ist länger als Vorname.\n "; } Achtung: Der arithmetische Gleichheitsoperator ist ==. Nicht zu verwechseln mit dem Zuweisungsoperator =. Programmierkurs für absolute Anfänger – Sitzung 2 25