Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.

Ähnliche Präsentationen


Präsentation zum Thema: "Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen."—  Präsentation transkript:

1 Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen

2 Anmerkungen zu Teil 1 Wichtige Zeichen: \n \t \e \033 \x1b \u \l Wichtige Vars: $_ $| $. $? $! $$ $< $0 $& $` $ @ARGV @INC %ENV Bitoperatoren: & | ^ ~ (and, or, xor, not) defined: if (defined $a)... if (defined &sub)... undef: undef $a; undef %h; undef ⊂ $a = undef;

3 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

4 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

5 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

6 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

7 if then else Syntax: if ( Bedingung ) {Statements;} else {Statements;} if ( Bedingung ) {Statements;} elsif ( Bedingung ) {Statements;} else {Statements;}

8 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

9 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 (@ARGV) { print $#ARGV+1, Args\n; } else { print Programm ohne Argumente\n; } print $cat, Katze, $cat == 1 ? : n;

10 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 _;

11 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;} }

12 Schleifen n In der Reihenfolge der Beliebtheit: for $i (@array) {$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 ; );

13 Schleifenkontrolle n Den Schleifen (wie auch jedem anderen Statement) kann ein Label gegeben werden: LINE:for $line (@lines) {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

14 Schleifen mit map und grep n Funktionen map und grep stellen implizit Loops dar @sizes = map { -s $_ } @files; ist äquivalent zu for ( @files ) { push @sizes, -s $_; } n grep testet den Block als Ausdruck und übernimmt die Elemente des Feldes, für die Ausdruck wahr @mylines = grep { /my/ } @lines; ist äquivalent zu for (@lines) { push @mylines, $_ if /my/; }

15 Schleifen und I/O Aufruf von perl mit Optionen -a, -i, -n, -p erzeugt implizite Schleife über @ARGV ( 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 von @ARGV oder STDIN gelesen

16 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...

17 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)

18 Parameterübergabe n Aufruf mit Liste (Parameterliste) Subroutine werden Werte in @_ übergeben n Call by Reference Änderung von @_ ändert Werte im rufenden Programm! Separat übergebene Felder sind in @_ 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

19 Ausführungskontext n Aufruf einer Funktion entscheidet über Kontext kann je nach Kontext unterschiedliche Dinge tun $a = @feld # linke Seite ist skalar, $a => $#feld @a = @feld # linke Seite ist Feld, @a => @feld n Viele Funktionen haben skalaren und Listkontext $datum=gmtime(); # Thu Jan 20 10:38:17 2000 @datum=gmtime(); # (17,38,10,20,0,100,4,19,0) Listkontext ist Standard, Skalarkontext kann erzwungen werden: print scalar gmtime(),\n;

20 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


Herunterladen ppt "Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen."

Ähnliche Präsentationen


Google-Anzeigen