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