Kommentare
Transcrição
Kommentare
Vergleichsoperator Leerstellen Patternmatch Einführung in Perl Quizauflösungen Subroutinen IMS Heike Zinsmeister Heike Zinsmeister $test ge "50 Euro" IMS Was wird hier verglichen? – ob $test ascii-wertig größer ist als "50 Euro". – 1,2,3,4,10,17,40,4000,200000000, etc. sind less than "50 Euro" – 6,7,8,50.1,60,70000, etc. sind greater than "50 Euro" Dateihandle Perl, 09.01.04 Quizauflösungen IMS 1 Heike Zinsmeister Perl, 09.01.04 – return – Argumente Quizauflösungen IMS Leerstellen und Print 2 Heike Zinsmeister Leerstellen und Patternmatch print-Zeile in Programm eingebettet: In Suchmustern werden Leerstellen unter Option x ignoriert. $i=0; print "Maximale Einrückung:\n"; chomp ($max =<STDIN>); print "Vorname <enter>, dann Nachname <enter> und ctrl-d\n"; chomp( ($vorname,$nachname) = <STDIN>); while ($max){ print "\t" x $i. "$vorname \t $nachname \n"; # <== !!! $max -= $i; $i++; } $_ = "XYZ(feature )XYZ"; if ( / \( # öffnende Klammer, gefolgt von ( [^\)]+[ ] ) # keiner schliessenden Klammer, # gefolgt von (expliziter) Leerstelle /x # Ende des (kommentierten) # Suchmusters ){ print "$_\n"; # Ausgabe:> feature } s/( \( ) # öffnende Klammer, gefolgt von ( [^\)]+[ ] ) # keiner schliessenden Klammer, # gefolgt von (expliziter) Leerstelle /$1 test/gx; # (gierige), kommentierte Ersetzung Problem: ungewollte unschöne Leerstellen Bedenke: alle Leerstellen im String werden ausgegeben! print "$_\n"; Perl, 09.01.04 Quizauflösungen 3 Perl, 09.01.04 # Ausgabe:> XYZ( test)XYZ ! Quizauflösungen 4 Heike Zinsmeister IMS IMS Heike Zinsmeister Input: Dogil, Greg Kamp. Hans Rohrer Christian # # # # Patternmatch (2) Problem: + ist ein gieriger Operator Patternmatch (1) Auswege – expliziter Ausschluss aller unerwünschter Zeichen while (<>){ chomp; if(/^([^ ]+)(,.)? ([^ ]+)/){ $w1 = $1; $w2 = $3; print "$w2 $w1\n"; } } ([ ,. ]+) Fehler: (,.)? sucht nach optionaler Sequenz ‘Komma gefolgt von beliebigem Zeichen’, d.h. nach 2 Stellen Problem: Ausgabe mit Trennzeichen “,.” Auswege Greg Dogil, Hans Kamp. Christian Rohrer – Alternation mit geschütztem Punkt (,| .)? – Bildung einer Zeichenklasse [,.]? Quizauflösungen IMS 5 Heike Zinsmeister Perl, 09.01.04 Perl, 09.01.04 ]+?) – Verwendung eines nicht gierigen Operators ([ Quizauflösungen IMS Heike Zinsmeister Patternmatch (3) return (1) Mögliche Lösung # # # # 6 #! /usr/local/bin/perl -w ... $wert = &div(1,3); # Aufruf der Subroutine ... Input: Dogil, Greg Kamp. Hans Rohrer Christian while (<>){ chomp; if(/^([^ ]+?)[,.]? ([^ ]+)/){ $w1 = $1; $w2 = $2; print "$w2 $w1\n"; } } sub div { my ($x,$y) = @_; # Definition der Subroutine # Einlesen der Argumente my $result = $x/$y; # Berechnung return ($result); # Rückgabe des Ergebnisses ins Hauptprogramm print "$x / $y = $result\n"; # Zwischenausgabe der Berechnung } # nicht gierig mit Zeichenklasse # !!! Problem: Zwischenausgabe erscheint nicht auf dem Bildschirm. Ausgabe: Greg Dogil Hans Kamp Christian Rohrer Perl, 09.01.04 Quizauflösungen 7 Perl, 09.01.04 Quizauflösungen 8 Heike Zinsmeister IMS IMS Heike Zinsmeister return (2) sprintf Lösung: Speicherung von formatierter Ausgabe #! /usr/local/bin/perl -w ... $wert = &div(1,3); # Aufruf der Subroutine ... sub div { my ($x,$y) = @_; #! /usr/local/bin/perl -w ... $wert = &div(1,3); # Aufruf der Subroutine ... # Definition der Subroutine # Einlesen der Argumente sub div { my ($x,$y) = my $result = $x/$y; # Berechnung print "$x / $y = $result\n"; # Zwischenausgabe der Berechnung return ($result); # Rückgabe des Ergebnisses ins Hauptprogramm } @_; # Definition der Subroutine # Einlesen der Argumente my $result = sprintf "%.2f",$x/$y; # Berechnung print "$x / $y = $result\n"; # Zwischenausgabe der Berechnung return ($result); # Rückgabe des Ergebnisses ins Hauptprogramm } Jetzt scheint die Zwischenausgabe Aber: unschöne Ausgabe 1 / 3 = 0.333333333333333 Perl, 09.01.04 Quizauflösungen IMS 9 Heike Zinsmeister Dateihandle open (OUT, ">>$file.out") or warn "Kann $file.out nicht wieder öffnen ($!)"; print (OUT, "Ende\n"); close(OUT); Problem: bei print, printf, oder sprintf darf nach dem Dateihandle kein Komma stehen $c++; printf (OUT "%2d\.",$c); print (OUT "$_\n"); NB: Neues Standarddateihandle festlegen mit select select OUT; printf ("%2d\.",$c); print ("$_\n"); Perl, 09.01.04 # Ausgabe nach OUT # Ausgabe nach OUT Quizauflösungen 11 Perl, 09.01.04 Quizauflösungen 10