Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen
Anmerkungen zu Teil 1 Wichtige Zeichen: \n \t \e \033 \x1b \u \l Wichtige Vars: $_ $| $. $? $! $$ $< $0 $& %ENV Bitoperatoren: & | ^ ~ (and, or, xor, not) defined: if (defined $a)... if (defined &sub)... undef: undef $a; undef %h; undef ⊂ $a = undef;
3. Programmfluß n Einfaches Statement: durch ; begrenzt Leerraum (, \t, \n) wird außerhalb von Strings ignoriert (Ausnahme: Schlüsselwörter wie z.B. print) n Kommentar: eingeleitet mit #, gilt bis Zeilenende n Block: in { } eingeschlossene Statements zählen genauso wie einfaches Statement Subroutine: sub {statements;} Subroutinen heißen auch Funktionen, kein Unterschied können Argumente bekommen und Werte zurückgeben
Gültigkeitsbereich von Variablen n Alle Variablen sind global (im package main) $a ist identisch mit $main::a damit auch in jeder Subroutine sichtbar n Package kann geändert werden (siehe später) n Werte globaler Variablen können versteckt werden local $a# gilt in Block, Subroutine, File, eval für magische Variablen einzige Möglichkeit Variable erhält mit local nur neuen Wert, ist noch global
Lexikalische Variablen mit my Mit my definiert man Variablen, die nur im aktuellen Block (oder File, eval, sub) existieren Private Variablen mit my sind wirklich lokal my $a = 1; my ($b, $c); my %hash; n Analog zu auto Variablen in C Überwiegende Verwendung von my ist gute Praxis
Bedingte Ausführung n Falsche und wahre (logische) Ausdrücke falsch: 0, leerer String, Array, Hash, alles andere ist wahr n Verknüpfung logischer Ausdrücke mit and/or/not bzw. &&/||/! and/or/not hat sehr niedrige Priorität, ist meist besser n Abbruch der Auswertung wenn Wahrheiswert feststeht, wird nicht weiter ausgewertet $a && print 1;# print nur wenn $a wahr $a || print 2;# print nur wenn $a falsch
if then else Syntax: if ( Bedingung ) {Statements;} else {Statements;} if ( Bedingung ) {Statements;} elsif ( Bedingung ) {Statements;} else {Statements;}
Andere bedingte Operatoren n Alternative zu if-elsif-else, Syntax: Statement if Bedingung; Statement unless Bedingung; wird verwendet, wo Statement wichtiger als Bedingung n an C angelehnter if-then-else Operator Bedingung ? Wahr-statement : False-statement; wird gern in print Statements verwendet
Beispiele n Beispiele für Einsatz der verschiedenen Konstrukte open(FILE,hallo.pl) or die open failed\n print Debug: Wert von a:$a\n if $debug; if { print $#ARGV+1, Args\n; } else { print Programm ohne Argumente\n; } print $cat, Katze, $cat == 1 ? : n;
File Testoperatoren n Nicht nur Testoperatoren für Strings und Zahlen: etwa 30 Testoperatoren für Files Syntax: -x filename wobei x die Testart ist n wichtigste Teste: -r lesbar -e existiert-f file -x ausführbar -s Länge > 0-d Verzeichnis -w schreibbar -B Binärfile-l Link Nachfolgende Teste auf gleiches File benutzen _ statt Filename (Geschwindigkeit): exit if -B _;
Switch n Es gibt kein Switch Statement Nachbildung: siehe z.B perldoc -q switch Bei Verwendung von last (Äquivalent zu break in C): $_ = ; { if (/^a/) {$alpha++; last;} if (/^b/) {$beta++; last;} if (/^d/) {$debug=1; last;} }
Schleifen n In der Reihenfolge der Beliebtheit: for $i {$anzahl{$i}++;} for $i (1.. 10) {print 7*$i=,7*$i,\n;} while ($eps > 0.01) {.. iteriere weiter.. } for ($i=1; $i<101; $i++) {$gauss += $i;} while (1) {$_= ; last if /^quit/;} for (;;;) {print Hier hilft nur CTRL-C\n;} do { Statements ; } while ( Bedingung ; );
Schleifenkontrolle n Den Schleifen (wie auch jedem anderen Statement) kann ein Label gegeben werden: LINE:for $line {print $line;} n Änderung des Schleifendurchlaufs mit last; oder last LINE;# verlasse Schleife next; oder next LINE;# nächster Zyklus redo; oder redo LINE if...;# wiederhole last/next/redo auch in normalen Blöcken möglich
Schleifen mit map und grep n Funktionen map und grep stellen implizit Loops = map { -s $_ ist äquivalent zu for ) { -s $_; } n grep testet den Block als Ausdruck und übernimmt die Elemente des Feldes, für die Ausdruck = grep { /my/ ist äquivalent zu for { $_ if /my/; }
Schleifen und I/O Aufruf von perl mit Optionen -a, -i, -n, -p erzeugt implizite Schleife ( Filenamen) n Einlesen von Files typisch mit open FILE, $file or die $file: $!\n while ( ) { $line = $_; } close FILE; n Elegantere Möglichkeit: while (<>) { $line = $_; } dann wird entweder oder STDIN gelesen
Goto n Ist vorhanden n selbst computed goto ist implementiert!!! n habe ich noch nie gebraucht n sollte sicher im Interesse guten Stils vermieden werden n daher schnell weiter...
Subroutinen Deklaration/Definition: sub name {Statements;} Deklaration (vor Definition): sub name; Aufruf: name(Parameterliste); name Parameterliste; # name ist deklariert &name; oder name();# falls name nicht deklariert n Definition mit Prototypen möglich, nicht behandelt n Zahl der Parameter wird durch Aufruf festgelegt, nicht in Definition (Übereinstimmung von Aufruf und Definition ist Sache des Authors)
Parameterübergabe n Aufruf mit Liste (Parameterliste) Subroutine werden Werte übergeben n Call by Reference Änderung ändert Werte im rufenden Programm! Separat übergebene Felder sind vereint n Rückgabewert ist Wert der letzten Anweisung Kann auch durch return wert; festgelegt werden n als Rückgabewert ist Variable oder Liste möglich
Ausführungskontext n Aufruf einer Funktion entscheidet über Kontext kann je nach Kontext unterschiedliche Dinge tun $a # linke Seite ist skalar, $a => # linke Seite ist n Viele Funktionen haben skalaren und Listkontext $datum=gmtime(); # Thu Jan 20 10:38:17 # (17,38,10,20,0,100,4,19,0) Listkontext ist Standard, Skalarkontext kann erzwungen werden: print scalar gmtime(),\n;
Hausaufgaben n Überprüfe, ob 0, 0, 0, 00,,,, () Null bzw. falsch sind n Wie sind die Vorrangregeln für Operatoren? (Camel S.76) Wo soll man Leerzeichen und Leerzeilen im Programm pla(t)zieren? ( perldoc perlstyle ) n Schreibe ein Programm, das den vorzeitigen Abbruch bei logischen Operatoren ausnutzt (z.B. Test auf eins von 3 Betriebssystemen oder Abbruch) n Schreibe ein Programm, das Wortlisten von Files ausgibt n Wozu kann man perl -n oder perl -p gut gebrauchen? n Suche weitere kontextabhängige Funktionen