Dipl. Ing. (FH) Hans-Peter Kiermaier Einführung in die Programmierung mit Perl 1 (C)2009, Kiermaier Allgemeines Perl steht für Practical Extraction and Report Language aus Wikipedia: "Erfinder ist Larry Wall (*1954). Er ist, abgesehen von seinen Fähigkeiten als Programmierer, bekannt für seinen Humor, seinen Sprachwitz und seinen feinen Sinn für Ironie: Er gewann zweimal den IOCCCWettbewerb (International Obfuscated C Code Contest) für den undurchsichtigsten C-Quelltext." 2 Perl steht für Practical Extraction and Report Language und ist eine vom Amerikaner Larry Wall entwickelte Skriptsprache. Perl kommt aus dem UNIX Bereich, und wurde ursprünglich für die Adminstration und Konfiguration von verteilten Computer eingesetzt. Mittlerweile hat sich diese Skriptsprache aber auch auf anderen Plattformen etabliert. Heute gibt es Perl-Interpreter für Unix, MS-DOS, alle Windows Plattformen, MacOS, Amiga, BeOS, NextOS, VMS, OS/2, AS400, ... Perl wird als universelles Werkzeug verwendet. Mit dieser Skriptsprache können Probleme aus den verschiedensten Bereichen gelöst werden: CGI, Webprogrammierung, Netzwerkadministration, Datenbankanbindungen sowie umfangreiche Unterstützung für das Durchsuchen von beliebigen Dateien und Extrahierung von Informationen aus diesen Dateien (daher der Name "Extraction and Report Language"). 2 (C)2009, Kiermaier Wie beliebt ist Perl? 3 In der Beliebtheit steht C und C++ ganz oben. Obwohl es sich um eine nicht ganz einfach zu erlernende Sprache handelt. C wird hauptsächlich zur Systemprogrammierung verwendet, z.B. für die Programmierung von Betriebssystemen und Mikrocontrollern. Allerdings wird mit C auch Anwendungssoftware entwickelt. Viele andere Programmiersprachen haben sich in Sachen Design und Syntax an C orientiert, z.B. C#, Java, Perl oder PHP. C ist eine prozedurale Programmiersprache (d.h. Programme werden in kleinere Prozeduren aufgeteilt) und hat eine Code-Blockstruktur. C++ hat gleichzeitig die Eigenschaften einer High-Level und einer Low-LevelProgrammiersprache. Dank dieser Kombination ist eine sehr effiziente Programmierung möglich. C++ wird oft für die Entwicklung von Anwendungssoftware für Windows und Linux verwendet und ist daneben die beliebteste Sprache der Spieleprogrammierer 3 (C)2009, Kiermaier Was braucht man für Perl? Quellcode in "PL"-Textdatei #!/usr/bin/perl -w print "Hello World!\n"; chomp($ende = <STDIN>); Perl-Interpreter (Übersetzer) BA B4 CD B8 CD 48 6C 00 09 21 01 21 61 6F 00 4C 6C 00 Mov Mov Int Mov Int db db DX,textadr AH,09 21 AH,4C01 21 "Hal" "lo" Übersetzte Zeile 4 Um ein Perl-Programm zu erstellen, ist kaum mehr nötig als nur den Code einzutippen. Zusätzlich braucht man ein spezielles Programm, das den in einer "PL"-Datei vorliegenden Code in Maschinensprache übersetzt. Die Anweisungen in einem Perl-Skript werden meist nicht vollständig kompiliert, sondern von einem Interpreter beim Aufruf abgearbeitet. Der große Nachteil dieses Prinzips ist die Geschwindigkeit der Ausführung. Skripts sind nicht so schnell ausführbar wie kompilierte und gelinkte Programme. Daher eignen sich Skript-Sprachen auch nur für eher kleine Programme und Anwendungen. Dadurch, dass ein Perl-Skript interpretiert wird, braucht ein Skript nicht für jede Betriebssystemumgebung neu kompiliert werden. Damit sind Perl-Skripts problemlos portabel und laufen überall, wo ein Perl-Interpreter installiert ist. 4 (C)2009, Kiermaier Wo bekommt man Perl? Auf den Seiten des O‘Reillys Verlag http://www.perl.com Bei Activestate gibt es sogar ganze Entwicklerpakete (Perl DevKit 8.0) http://www.activestate.com bzw. http://downloads.activestate.com/ActivePerl/ 5 Es empfiehlt sich der Download von ActivePerl für Windows (X86) bei ActiveState. Das Developerkit ist im Prinzip nur für Enthusiasten. Auf www.perl.com sind Sie auf den Seiten des O'Reillys Verlag, der auch eine gute Perl-Dokumentation und wirklich empfehlenswerte Bücher anbietet: z.B. Programmieren mit Perl, Larry Wall, ISBN 3-89721-144-0, Bei Amazon für 56€. 5 (C)2009, Kiermaier Hilfreiche Editoren Notepad++ (komfortabel auch in Deutsch) http://notepad-plus.sourceforge.net/de/site.htm Notepad2 (keine Installation erforderlich) http://www.flos-freeware.ch/notepad2.html 6 Zum Erstellen des Quellcodes empfiehlt es sich Notepad++ oder Notepad2 herunterzuladen und zu installieren. Dies sind Texteditoren, die Programmiersprachen farblich unterstützen können. Perl-Skripts können im Prinzip mit jedem ASCII-Editor erstellt und bearbeitet werden, ideal ist aber ein leistungsfähiger Programmierer-Editor, der sich so konfigurieren lässt, dass er das Programmieren in Perl optimal unterstützt. Z.B. Notepad++ ist so ein Editor. Er unterstützt nicht nur Syntax-Highlighting für Perl, sondern auch HTML, CSS, PHP, ASP, C/C++, Java, JavaSkript und VBSkript, was für größere Projekte nützlich sein kann. Prinzipiell genügt aber auch das einfache Notepad aus Windows. Damit können wir jetzt beginnen, ein erstes Programm zu erstellen. TIPP: Im Notepad++ kann man das Programm gleich ausprobieren, indem man F5 bzw. Ausführen wählt. Allerdings verschwindet die Eingabeaufforderung sofort wieder. Um das zu umgehen kann man in das Fenster "Ausführen" folgende Zeile schreiben: cmd.exe /K perl.exe -w "$(FULL_CURRENT_PATH)" Das "/K" bewirkt, dass das Fenster nicht sofort wieder geschlossen wird. Damit lassen sich dann Ergebnisse und Fehlermeldungen leicht lesen. Anschließend muss man das CMD-Fenster selbst schließen. Auf diese Weise hat fast ein "IDE"-Gefühl (IDE = Integrated Development Environment). 6 (C)2009, Kiermaier Wie sieht ein Perl-Programm aus? Kommentare Perl-Pragmas bzw. Einbinden von Modulen globale Deklarationen Lokale Deklarationen Prozeduren, Funktionen Anweisungen Kommentare 7 Ein Perl-Programm besteht aus: •Kommentare # •Deklarationen (= formale Beschreibung aller verwendeten Klassen) •Anweisungsblöcke { } •weitere Funktionen 7 (C)2009, Kiermaier DAS erste Perl-Programm Im Notepad schreiben Sie die "hello.pl" Shebang-Zeile: Speicherort des PerlInterpreters für UNIX Anweisung den nachfolgenden Text auszugeben. Speichern Sie den Text. Mit "perl hello.pl" starten. Oder einfach nur "hello.pl" eingeben und Eingabetaste drücken 8 Erstellen Sie ein Übungs-Verzeichnis. Dann starten Sie Notepad (Notepad++ bzw. Notepad2) und tippen die Zeilen ab. Speichern Sie den Text unter "hello.pl". Im Eingabeaufforderungsfenster starten Sie dann den Übersetzungsvorgang mit "perl hello.pl". Als Ergebnis wird "Hello World!" ausgegeben. Sie könnten die "hello.pl" auch im Explorer doppelt anklicken, aber das Ausgabefenster würde schneller wieder verschwinden, als Sie es lesen könnten. Die Anweisung zur Lage des Perl-Interpreters beginnt mit dem Zeichen #! gefolgt von der Pfadangabe. Diese Anweisung wird vor allem von Unix- und Unixkompatiblen Systemen verwertet, und zwar dann, wenn die Perl-Datei auf den Modus ausführbar gesetzt ist. Die Datei kann dann direkt aufgerufen werden und startet automatisch den Perl-Interpreter. Laut Perl-Syntax ist diese erste Zeile, welche die Lage des Perl-Interpreters angibt, ein Kommentar. Kommentare beginnen in Perl mit dem Gatterzeichen #. Alles zwischen diesem Zeichen und dem Ende der gleichen Zeile wird vom PerlInterpreter ignoriert. Für mehrzeilige Kommentare müssen alle betroffenen Zeilen mit einem # beginnen. Die oben verwendete Funktion print gibt Information auf die Konsole aus. Im obigen Fall wird der String Hello world! ausgegeben. Zum Abschluss jeder Anweisung in Perl folgt ein Strichpunkt ;. Da er oft vergessen wird, ist es eine der häufigsten Fehlerursachen. Interessanterweise kann er auch erst in der nächsten oder übernächsten Zeile stehen. Sogenannte whitespaces (Leerzeichen, Zeilenumbrüche, Tabulatoren) werden nicht beachtet! Das geht also auch: print "Hello World!" ; 8 (C)2009, Kiermaier Aufrufoptionen des Perl-Interpreters Option -c -d -v -w Bedeutung Das Perl-Skript wird nicht ausgeführt, sondern nur auf syntaktische Richtigkeit überprüft Das Perl-Skript wird im Debug-Modus ausgeführt. Der Debug-Modus erlaubt das Austesten des Perl-Skripts. Gibt die Version und den genauen Stand des Perl-Interpreters aus. Bewirkt, dass der Perl-Interpreter nicht nur offensichtliche Fehlermeldungen bei Syntaxfehlern ausgibt, sondern auch Warnungen bei möglichen Fehlern und logisch zweifelhaften Anweisungsfolgen. Beispiele: perl -w hello.pl perl -c hello.pl 9 Aufrufmöglichkeiten des Perl-Interpreters Aufrufen kann man den Perl-Interpreter mit einem Perl-Skript, also einer Textdatei mit Perl-Programmanweisungen. Solche Dateien haben die StandardDateiendung ".pl". Der Perl-Interpreter wird normalerweise einfach mit perl gestartet. Daneben gibt es noch etliche Optionen beim Aufruf des PerlInterpreters. Die Optionen folgen unmittelbar hinter dem Programmdateinamen und vor dem Namen des Perl-Skripts (z.B.: perl -c hello.pl). Option Bedeutung -c Das Perl-Skript wird nicht ausgeführt, sondern nur auf syntaktische Richtigkeit überprüft -d Das Perl-Skript wird im Debug-Modus ausgeführt. Der Debug-Modus erlaubt das Austesten des Perl-Skripts. -v Gibt die Version und den genauen Stand des Perl-Interpreters aus. -w Bewirkt, dass der Perl-Interpreter nicht nur offensichtliche Fehlermeldungen bei Syntaxfehlern ausgibt, sondern auch Warnungen bei möglichen Fehlern und logisch zweifelhaften Anweisungsfolgen. 9 (C)2009, Kiermaier Variablen - $kalare Zuweisungsoperator $VarName = Wert / Ausdruck Datenrichtung richtig: falsch: $kalar = 123 5 = $kalar $variable = "123" 3 + 5 = $ergebnis $t = "Hallo" $t = 3 * 9 = $thoelke $kalar ist nicht gleich $Kalar 10 Skalare - einfache Variablen Der einfachste Typ in Perl ist die skalare Variable. Skalare Variablen können Zeichenketten (Strings) und Zahlen speichern. Im Gegensatz zu anderen Sprachen wird der Datentyp (String oder Zahl) nicht vorher festgelegt und kann auch jederzeit geändert werden. Ein Skalar, also eine einfache Variable, beginnt mit dem Dollarzeichen $, gefolgt von dem Namen der Variablen. Das Dollarzeichen muss immer angegeben werden, wenn die Variable verwendet wird, egal ob ihr ein Wert zugewiesen wird, oder ob sie in einer Operation vorkommt. Ob ein Skalar numerisch oder eine Zeichenkette ist, entscheidet sich erst, wenn dem Skalar einen Wert zugewiesen oder er in einer Anweisung verwendet wird. Eine angegebene Zeichenkette muss dabei in Anführungszeichen stehen. Normalerweise sind das doppelte Anführungszeichen, es sind aber auch einfache Anführungszeichen erlaubt. Leerzeichen vor und nach dem Zuweisungsoperator sind nicht erforderlich, können aber die Leserlichkeit erheblich verbessern! Achtung! C-Typisch ist die Groß/Kleinschreibung zu beachten! Ein Skalar mit einem Großbuchstaben am Anfang ist nicht identisch mit einem bedeutungsgleichen Skalar mit einem Kleinbuchstaben. 10 (C)2009, Kiermaier Variablen - $kalare Fehlerhafte Namen: $Bill Gates = 0; Keine Leerzeichen in Variablennamen $print = "Hallo"; Schlüsselwörter vermeiden $lies.das = 5; Keine Operatoren in Namen $addiere+1 = 2; auch hier $myZahl! = 1; auch hier $a = 5; $b = 3; Reservierte Bezeichner vermeiden $_ = "hier" auch hier (!!!) $0815 = 3 Ziffern hinterm $ vermeiden (geht aber: Zahlenbasis) Ordnungsgemäße Bezeichner: $Bill_Gates = "Rentner" statt Leerzeichen lieber Unterstriche $ergebnis = 5 aussagekräftige Namen wählen $Leer = "" einen leeren Text zuweisen 11 11 (C)2009, Kiermaier Variablen - $kalare Strings - Zeichenliterale Stringliterale: Zeichenketten (Texte) werden in Anführungszeichen eingeschlossen. Einige Zeichen beginnen mit einem Backslash und haben eine spezielle Bedeutung: \a \n \r \t \b \" \' \\ \$ \@ Akustisches Signal (Bell) Zeilenvorschub (neue Zeile) Wagenrücklauf (Anfang der Zeile) Tabulator BackSpace (Rückschritt) Doppeltes Anführungszeichen im Text Einfaches Anführungszeichen im Text Ein Backslash-Zeichen Das Dollar-Zeichen (Skalarzeichen) Das At-Zeichen (Listenzeichen) (ASCII 07) (ASCII 10) (ASCII 13) (ASCII 09) (ASCII 08) (ASCII 34) (ASCII 39) (ASCII 92) (ASCII 36) (ASCII 64) 12 Stringliterale Stringliterale sind unmittelbar angegebene Zeichenketten. Bedingung dafür ist, dass Sie Zeichenketten in Anführungszeichen einschließen. Für einen größeren Text können Sie mehrere Zeilen benutzen! Sie werden dann automatisch beim Kompilieren zu einem Text zusammengezogen (Whitespace wird nicht beachtet). Einige Zeichen sind so nicht darstellbar und haben spezielle Bedeutungen. Damit man sie verwenden kann, stellen Sie einfach einen Backslash \ davor. Sie können an beliebiger Stelle und beliebig oft im Text vorkommen. 12 (C)2009, Kiermaier Variablen - $kalare Strings - Zeichenliterale Beispiel: 13 Übung: Das Hello-World Programm so umschreiben, dass es in eine Variable geschrieben wird und ein Zeilenvorschub angehängt wird. Lösung: Mit \t wird ein Tabulator eingefügt, also "World" erst ein Stück weiter rechts gedruckt. Dann werden 2 Leerzeilen ausgegeben, weil "\n\n" zwei Zeilenvorschübe erzwingt. Zusätzlich kommt der 'unsichtbare' Zeilenvorschub im Quelltext. Nach der dritten Ausgabezeile erfolgt ein weiterer Zeilenvorschub. Dies ist in anderen Programmiersprachen nicht erlaubt: Eine Zeichenkette darf nur in Perl über eine Zeile hinausgehen. 13 (C)2009, Kiermaier Variablen - $kalare Strings - Hochkommas Hochkommas sind die wörtliche Form ohne Interpretation des Inhalts: print 'Hello \t World\n\n'; ergibt also In der Print-Anweisung können mehrere solcher String-Literale und Variablen durch Kommatas getrennt angegeben werden: $t = 'da draussen'; $leer = ' '; print 'Hallo', $leer, $t, '\n'; 14 Es gibt zwei Möglichkeiten Zeichenketten bzw. Stringliterale zu schreiben: mit Anführungszeichen "" oder mit Hochkommas ' '. Texte, die in Hochkommas eingeschlossen sind, werden nicht interpretiert. Alle Inhalte sind wirklich nur Text! Das bedeutet, dass zum Beispiel '\n' keinen Zeilenvorschub bewirkt, sondern genau so ausgegeben wird. 14 (C)2009, Kiermaier Variablen - $kalare Strings - Anführungszeichen Anführungszeichen ermöglichen die Interpretation des Inhalts: print "Hello \t World\n\n" ergibt also Variablen werden dabei durch ihren Inhalt ersetzt (interpretiert): $t = 'da draussen'; $leer = " "; print "Hallo$leer$t\n"; 15 Durch Anführungszeichen können Zeichenketten nach ihrem Inhalte untersucht und eventuell interpretiert werden. Dadurch verändert sich die Ausgabe zum Teil dramatisch. Werden zum Beispiel Variablen in Zeichenketten mit Anführungszeichen eingeschlossen, so werden statt der Namen die Inhalte dieser Variablen ausgegeben! (Anmerkung: In Perl-Büchern steht statt Interpretation oft Interpolation) 15 (C)2009, Kiermaier Variablen - $kalare Strings - Backticks Backticks sind links gerichtete Hochkommas und werden als DOS-Befehl interpretiert. Das heißt, das Betriebssystem führt den Inhalt dieser Zeichenketten als Befehl aus. Ausgabe der aktuelle System-Uhrzeit, ohne sie zu ändern: print `echo. | time`; Ausgabe des Laufwerknamens von C: print `vol c:`; Inhalt des Laufwerks U: in Datei schreiben: print `dir u:\ > u:\inhalt.txt`; Sofortige Formatierung einer Diskette in A: ohne (Sicherheits-)Rückfrage: print `echo. | format a:`; 16 16 (C)2009, Kiermaier Variablen - $kalare Zahlen Ganze Zahlen: $kalarzahl = 5; # ist eigentlich 5,00000000000000 use integer; # pragma stellt "echte" Ganzzahlen ein $n = 2047; $betrag = 1_234_567; # 1000er Trennzeichen $c = "123" # Zahl in Textdarstellung $erg = "123" + "456" # Ergebnis 579 trotz Zeichenketten! Fließkommazahlen: $kalarzahl =123.45; $pi = 3.14159265358979; $betrag = 0.123_456_7; $z = .1234567 $c = 2.99792456E8 # ein Punkt statt Komma! # so viele Stellen hat der C-Typ double # 1000er Trennzeichen auch hinterm Komma # die Null vorm Komma kann auch entfallen # oder klein 2.99e8 17 Standardmäßig sind Zahlen in Perl Fließkommazahlen mit doppelter Genauigkeit (C-Typ double). Also wenn man 5 schreibt, ist es in Wirklichkeit 5.000000000. Will man "echte" Integerzahlen verwenden, muss man das Pragma "use integer" verwenden. Daten in Perl sind nicht "getypt". Mit eine Zeichenkette, die nur aus gültigen numerischen Zeichen besteht (z.B. "123"), kann man problemlos numerische Operationen durchführen. Ebenso ist es möglich numerische Werte wie Zeichenketten behandeln. 17 (C)2009, Kiermaier Variablen - $kalare Andere Zahlenbasis Zahlenbasis oktal (durch führende 0): Wertevorrat 0,1,2,3,4,5,6,7 Stellenwertigkeit: 8³ 8² 8¹ 8º = 512 64 $kalarzahl = 077; # $z = 01234567; 8 7 1 7 = 63d Zahlenbasis hexadezimal (durch führendes 0x): Wertevorrat 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F Stellenwertigkeit: 16³ 16² 16¹ 16º = 4096 256 16 1 $kalarzahl = 0x3BC; # 3 11 12 = 956d $z = 0x400; Zahlenbasis binär (durch führendes 0b): Wertevorrat 0,1 Stellenwertigkeit: 2³ 2² 2¹ 2º = 8 4 2 1 $kalarzahl = 0b0101; # 1 0 1 = 5d $z = 0b01100001; 18 Zahlen sind standardmäßig im Dezimalsystem angegeben. Falls man andere Zahlensysteme (Basis) braucht, kann man der Zahl ein Kürzel voranstellen. Eine führende Null sagt, es handelt sich um eine Zahl im Achtersystem (Oktal). Das heißt, es können nur Ziffern von 0 bis 7 vorkommen. Eine führende Null und ein anschließendes X legen eine Hexadezimalzahl fest. Hier können Ziffer von 0 bis 9 und die Buchstaben A bis F vorkommen. Eine Null und B schließlich legen Binärzahlen fest, in der nur die Ziffern 0 und 1 vorkommen können. 18 (C)2009, Kiermaier Variablen - $kalare Konsolen-Eingabe $eingabe = <STDIN>; Beispiele: # Ausgabe: "Wie heisst du? " # Eingabe: nach $eingabe chomp(variable/liste); chop(variable/liste); # Ausgabe: Gesamttext Beispiele: # $t mit Text füllen # Zeilenvorschub in $t entf. # Ausgabe: Gesamttext 19 Statt einer Variablen einen Wert oder Ausdruck zuzuweisen, kann man auch von der Konsole einlesen. Dazu benutzt man den Datei-Handle <STDIN> (üblicherweise in Großbuchstaben). Dadurch hält der Interpreter an und erwartet vom Benutzer eine Eingabe. Sobald die Eingabetaste gedrückt wird, fährt der Interpreter fort und weist die Eingabe der Variablen zu. Anzumerken ist dabei, dass das Eingabezeichen mit übergeben wird! Um dieses u.U. störende Eingabezeichen zu entfernen, kann man die Funktion CHOMP() benutzen. Damit werden alle nachfolgenden Zeilenvorschübe aus der Variablen entfernt. Achtung! Weil die Funktion chomp() auch eine Anweisung ist, kann sie keine Textliterale (=Konstanten: "abc") bearbeiten. Als Funktion ($n = chomp..) liefert sie selbst nur die Anzahl der entfernten Zeichen zurück. Genaugenommen entfernt chomp() am Ende eines Strings die Zeichenkette, die in der Variablen "$/" steht (Standardwert: "\n"). Ist "$/" leer, so werden alle Zeilenvorschübe abgeschnitten. Im Gegensatz dazu entfernt CHOP() grundsätzlich das letzte Zeichen. Übung: Das erste Programm mit der Eingabe so umschreiben, dass die Zeilenvorschübe entfernt werden und bei der Ausgabe wieder alles in einer Zeile steht. Lösung: 19 (C)2009, Kiermaier Operatoren Arithmetische Operatoren ++, - ** !, ~, \, +, *, /, %, x +, -, . Inkrement (Erhöhen um 1), Dekrement (Vermindern um 1) Potenz Unäre Operatoren (not, Komplement, positiv, negativ) Multiplikation, Division, Restwert (Modulo), Vervielfachung Addition, Subtraktion, Konkatenation Beispiele: $zahl = $zahl + 1; $zahl++; $zahl = ++$x; $zahl = $x++; $y = $x**2 + 2*$x + 1; $ah = -5**2; $d = 1025 % 256; $e = "Ergebnis = ".$wert # Der Inhalt von $zahl wird um eins erhöht # wie oben # (präfix) $x um eins erhöht, Ergebnis in $zahl # (postfix) akt. $x in $zahl, dann $x erhöht # $y erhält den Wert von x²+2x+1 # $ah wird -25 (Potenz vor Vorzeichen) # $d wird 1 (1025:256 = 4 Rest 1) # Ergebnis und $wert werden als ein Text nach # $e geschrieben 20 20 (C)2009, Kiermaier Operatoren Arithmetische Operatoren Beispiel: 21 Übung: Schreiben Sie ein Programm, das zur Eingabe von x auffordert und dann y = x² + 2x + 1 berechnet und das Ergebnis ausgibt. Lösung: Übung: Fordern Sie zur Eingabe eines Eurobetrags auf und geben Sie dann den DM-Betrag aus (1€ = 1.95583DM). Benutzen Sie Variablenzwang (strict). Lösung: 21 (C)2009, Kiermaier Operatoren Zuweisungsoperatoren Variable = Variable op Wert; kurz: ZOP = += -= *= /= %= **= <<= >>= Variable zop Wert; Typ Gleichheit Inkrement um Wert Dekrement um Wert Multiplikation mal Wert Division durch Wert Rest Division durch Wert Potenz hoch Wert Bitweise nach links Bitweise nach rechts Beispiel $zahl = 1; $zahl += 10; $zahl -= 2; $zahl *= 5; $zahl /= 9; $zahl %= 3; $zahl **= 2; $zahl <<= 2; $zahl >>= 3; Ergebnis 1 11 9 45 5 2 4 16 (d.h. x 2²) 2 (d.h. / 2³) 22 Leider ist auch erlaubt: $zahl1 = $zahl2 = 5 (Beide Variablen bekommen den Wert 5). Aber hierbei die Datenrichtung beachten! Zahlenliterale (Konstanten) können nicht mit anderen Werten 'gefüllt' werden (siehe Folie Variablen). 22 (C)2009, Kiermaier Operatoren Zuweisungsoperatoren ZOP Typ Beispiel $text = "Hallo"; Ergebnis .= x= String-Konkatenation String-Vervielfältigung $text .= " du"; $text x= 2; "Hallo du" "Hallo duHallo du" &= |= ^= Bitweises Und Bitweises Oder Bitweises Xor $zahl = 0x55; $zahl &= 0xA5; $zahl |= 0xAA; $zahl ^= 0xFF; 5 (0x5) 175 (0xAF) 80 (0x50) Logisches Und Logisches Oder $zahl = true; $zahl &&= true; $zahl ||= false; true true &&= ||= 23 23 (C)2009, Kiermaier Funktionen Integrierte mathematische Standardfunktionen abs (wert) Absolutwert bilden (pos. Betrag einer Zahl) print abs(-5.179); Ergebnis: 5.179 int (zahl) Ganze Zahl bilden (Nachkommaanteil entfällt!) print int(5.179); Ergebnis: 5 print int(-5.179); Ergebnis: -5 (korrekt wäre -6) hex (String) Hexedezimalstring in Dezimalzahl umwandeln print hex('FFFF'); Ergebnis: 65535 oct (String) Oktalstring in Dezimalzahl umwandeln print oct('7654'); Ergebnis: 4012 24 Es gibt eine Reihe von mathematischen Funktionen, die in Perl bereits integriert sind und die man benutzen kann. Darüberhinaus können über das POSIX-Modul weitere Funktionen genutzt werden. Leider hält sich Perl nicht an einen allgemeinen Funktionsbegriff nach dem ein Argument in Klammer angegeben sein muss. In Perl stehen Funktionen völlig willkürlich manchmal mit Klammern, manchmal ohne Klammern. Die hier genannten mathematischen Funktionen kommen zum großen Teil ohne Klammern aus. Sie sollten sich aber daran gewöhnen Klammern für die Argumente zu benutzen! Generisches Runden mit der Int-Funktion: Da die Int-Funktion eigentlich nur ein Fix() ausführt, also nur Nachkommastellen entfernt, muss man zum Runden zwischen positiven und negativen Argumenten unterscheiden. Jeweils auf 3 Nachkommastellen gerundet: Für positive Argumente: $erg = int($zahl * 1000 + 0.5)/1000 Für negative Argumente: $erg = int($zahl * 1000 – 0.5)/1000 Übung: Schreiben Sie ein kleines Programm, dass zur Eingabe einer (positiven) Fließkommazahl und der Nachkommastellen auffordert und dann das gerundete Ergebnis ausgibt. Lösung: 24 (C)2009, Kiermaier Funktionen Integrierte mathematische Standardfunktionen exp (wert) Exponentialfunktion ewert print exp (1); Ergebnis: 2.718281828.. log (wert) nat. Logarithmus Ln(wert) print log (2.718281828); Ergebnis: 0.99999999. .(=1) Beliebige Basis: Log(wert)/Log(Basis) z.B. Dekadischer Logarithmus: print log(1000)/log(10); Ergebnis: 3 sqrt (wert) Quadratwurzel print sqrt(16); Ergebnis: 4 25 Übung: Schreiben Sie ein Programm, das zur Eingabe einer Zahl und einer Basis auffordert und dann daraus den Logarithmus zur Basis berechnet und ausgibt. Lösung: 25