Tagesüberblick 3

38
1 Tagesüberblick 3 • Lösung Hausaufgabe/Fragen • Zeilenweises Lesen von Dateien • Schleifenausbrüche • Die Variable $_ • Textfunktionen

description

Tagesüberblick 3. Lösung Hausaufgabe/Fragen Zeilenweises Lesen von Dateien Schleifenausbrüche Die Variable $_ Textfunktionen. Zeilenweise lesen aus Dateien while-Schleife. $file = "daten"; open (INFO,$file) || die "Oeffnen $file $!"; while ($a = ) # lese Zeile in Variable - PowerPoint PPT Presentation

Transcript of Tagesüberblick 3

Page 1: Tagesüberblick 3

1

Tagesüberblick 3

• Lösung Hausaufgabe/Fragen

• Zeilenweises Lesen von Dateien

• Schleifenausbrüche

• Die Variable $_

• Textfunktionen

Page 2: Tagesüberblick 3

2

Zeilenweise lesen aus Dateienwhile-Schleife

$file = "daten";

open (INFO,$file) || die "Oeffnen $file $!";

while ($a = <INFO>) # lese Zeile in Variable

print $a; # automatisch beendet bei EOF

}

close (INFO);

Page 3: Tagesüberblick 3

3

Zeilenweise lesen aus Dateien do until-Schleife

$file = "daten";

open(ABC,$file) || die "Oeffnen $file $!";

do { # Der Parameter EOF wird gesetzt,

$c=<ABC>; # wenn beim Lesen das Datei-

print $c; # ende erreicht wird.

} # Es muss hier beachtet werden,

until(eof); # dass leere Dateien nicht sauber

close(ABC) # behandelt werden.

Page 4: Tagesüberblick 3

4

Schleifenausbruch last

$file='daten2-1.txt';

open (INFO,$file) || die "Oeffnen $file $!";

while ($a = <INFO>) {

print $a;

chomp ($a);

last if ($a eq 'Schluss'); # Abbruch wenn

} # Bedingung erfüllt

close (INFO);

Page 5: Tagesüberblick 3

5

Schleifenneustartnext

$file='daten2-1.txt';

open (INFO,$file) || die "Oeffnen $file $!";

while ($a = <INFO>) {

chomp ($a);

next if (length($a) == 0); # nächster Schleifen-

print "$a\n"; # durchlauf wenn Be-

} # dingung erfüllt.

close (INFO);

Page 6: Tagesüberblick 3

6

Die besondere Variable $_ (I)

$file = "daten";

open (INFO,$file) || die "Oeffnen $file $!";

while ($_ = <INFO>) {

print $_;

}

close (INFO);

Page 7: Tagesüberblick 3

7

Die besondere Variable $_ (II)

$file = "daten";

open (INFO,$file) || die "Oeffnen $file $!";

while (<INFO>) {

print;

}

close (INFO);

Page 8: Tagesüberblick 3

8

Zu Beachten# $_ können sie nicht immer weglassen!

$file = "daten";

open (INFO,$file) || die "Oeffnen $file $!";

while (<INFO>) {

print "$_\n"; # Hier ist $_ nötig!

}

close (INFO);

Page 9: Tagesüberblick 3

9

Textfunktionen

• split # teilt String in Liste

• join # verbindet Strings einer Liste

• tr #Translationsoperator für Zeichen

• substr #extrahiert Teilstring aus String

• index# Positon eines Strings in String

Page 10: Tagesüberblick 3

10

split (I)

$info="Einstein:Albert:Nobelpreistraeger";

@wer=split(/:/,$info); # teilt an den :

# die Zeichenkette# $info auf

print "@wer";

# liefert: Einstein Albert Nobelpreistraeger

Page 11: Tagesüberblick 3

11

split (II)#perl -w

$info="Einstein:Albert:Nobelpreistraeger";

($name,$vorname,$beruf)=split(/:/,$info);

# teilt an den : die Zeichenkette $info auf # falls links zu wenig Skalare stehen, wird # der Rest verschlucktprint "$name,$vorname,$beruf";

# liefert: Einstein,Albert,Nobelpreistraeger

Page 12: Tagesüberblick 3

12

join

$abc=join(":",@wer); # Zusammenfuegen

# mit : als Trenner

$def=join("\n",@wer," ",$abc);

# Zusammenfuegen newline als

# Trenner und Leerzeichen

# für eine Leerzeile

# Beachte: mehrere Argumente

print "$abc\n$def";

Page 13: Tagesüberblick 3

13

Ergebnis

Einstein:Albert:Nobelpreistraeger

Einstein

Albert

Nobelpreistraeger

Einstein:Albert:Nobelpreistraeger

Page 14: Tagesüberblick 3

14

Aufgaben3-1 Die Datei daten3-1.txt enthält in jeder Zeile

einen Namen, einen Vornamen und ein Alter jeweils durch Komma getrennt. Lesen Sie dies ein und geben Sie alle Informationen jeweils in folgendem Format aus:Vorname Name:Alter

3-2 Speichern Sie jetzt die Daten in der ursprüng- lichen Reihenfolge, jedoch mit Semikolon als Trennzeichen in einer zweiten Datei ab.

Page 15: Tagesüberblick 3

15

Aufgabe 3-3

• Die Datei daten3-2.txt enthält in jeder Zeile einen Namen, einen Vornamen, ein Kürzel für das Geschlecht (w,m) und ein Alter jeweils durch Komma getrennt. Lesen Sie dies ein und ermitteln Sie das Durchschnittsalter für das jeweilige Geschlecht.

3-3 Anschließend geben Sie das jeweilige Durchschnittsalter aus.

Page 16: Tagesüberblick 3

16

tr (translate)• tr/Suchliste/Ersatzliste/[s][c]...

– Ersetzen der Zeichen in der Suchliste durch die Zeichen der Ersatzliste

– Wirkt normalerweise auf $_– c Entfernen der Suchliste aus dem gesamten

Zeichenvorrat und verwenden der resultierenden Zeichenkette als Suchliste (Negation)

– s Zusammenziehen aller mehrfach identischen Ersatzzeichen zu einem Ersatzzeichen

Page 17: Tagesüberblick 3

17

Beispiel$_="*a*12345*b*cdefdg#\n";

tr/a-zäöü/A-ZÄÖÜ/; # Umlautproblematik

print; # in Windows !!

# Umwandlung von $_ in Großbuchstaben

tr/0-9/a-j/; # Umwandlung von 0-9 in a-j

print;

Page 18: Tagesüberblick 3

18

Weitere Möglichkeiten

$xyz='ab*cdef1*2432543tr';

$xyz=~tr/\*/\#/; # tr/\*/\#/ ersetze Stern mit Lattenzaun

print "$xyz\n"; $num = ($xyz =~ tr/2/ä/); # ersetze 2 mit ä

print "Anzahl=$num\nXYZ=$xyz\n";

# Umwandlung aller 2 in ä in $xyz

# $num enthält die Anzahl der Translations

Page 19: Tagesüberblick 3

19

Ergebnis

ab#cdef1#2432543tr

Anzahl=2

XYZ=ab#cdef1#ä43ä543tr

Page 20: Tagesüberblick 3

20

Beispiele

tr/0-9/ /; # Ersetzt alle Zahlen durch

# jeweils eine Leerstelle

tr/0-9/ /c; # Ersetzt alle nicht-Zahlen

# durch jeweils eine Leerstelle

tr/0-9/ /s; # Ersetzt alle aufeinanderfolgenden # Zahlen durch genau eine Leerstelle

Page 21: Tagesüberblick 3

21

substr (string,start,lenght)

$a="abcdefghijklmnopqrstuvwxyz";

$b=substr($a,3,4); # 4 Zeichen ab dem Vierten

$c=substr($a,7); # Alle Zeichen ab dem Achten

$d=substr($a,-8,5); # 5 Zeichen ab dem

# Achtletzten

print "$b:$c:$d"; # liefert:

# defg:hijklmnopqrstuvwxyz:stuvw

# Merke vorn wird ab 0 gezählt, hinten ab 1

Page 22: Tagesüberblick 3

22

Besonderheiten von substr# Falls die Adressierung von substr außerhalb der Zeichen-

# kette liegt: Fehler. Unbedingt sicherstellen, daß die Zeichen-

# kette lang genug ist; oder Fehler abfangen.

$b=substr($a." "x7,3,4);

$c=substr($a." "x8,7);

$d=substr((" "x8).$a,-8,5);

$b=substr($a,3,4) || die "Fehler 4711" ;

if (length($a) > 6){$b=substr($a,3,4)} # Fehlerbehandlung

else{die '$a zu kurz';}

Page 23: Tagesüberblick 3

23

indexDie Funktion index dient zum Suchen der Stelle

des ersten Auftretens einer Teilzeichenkette in

einer Zeichenkette.

index(zeichenkette,teilzeichenkette)

index(zeichenkette,teilzeichenkette,position)

zeichenkette In dieser Zeichenkette wird gesucht.

teilzeichenkette Diese Zeichenkette wird gesucht.

position Ab dieser Stelle wird gesucht.

Page 24: Tagesüberblick 3

24

Beispiel#!perl -w

$a='abcdefghijklmnopqrstuvwxyzabc';$b=index($a,'b'); # erstes vorkommen von b

$c=index($a,'bc',7); # zweites Vorkommen von bc

$d=index($a,'789'); # string kommt nicht vor

print "\$b=$b \$c=$c \$d=$d";

#liefert: $b=1 $c=27 $d=-1

Page 25: Tagesüberblick 3

25

Aufgaben• Lesen Sie die Datei daten3-3.txt ein

• Wandeln Sie alle Klein- in Großbuchstaben um (nur int. Alphabet).

3-4 Geben Sie jeweils das vierte bis siebte Zeichen jeder Zeile aus.

3-5 Geben Sie die letzten 6 Zeichen jeder Zeile aus.

Page 26: Tagesüberblick 3

26

Aufgaben• Lesen Sie die Datei daten3-4.txt ein.

3-6 Wenn in einer Zeile die Zeichenkette auf enthalten ist geben sie die Zeilennummer und Position der Zeichenkette an.

Page 27: Tagesüberblick 3

27

# Lösung 3-1a

#!perl -w$file='daten3-1.txt';open (INFO,$file) || die "Oeffnen $file $!";while ($a=<INFO>) { @infos=split (/,/,$a); print "$infos[1] $infos[0]:$infos[2]";}close (INFO);

Page 28: Tagesüberblick 3

28

# Lösung 3-1b

#!perl -w$file='daten3-1.txt';open (INFO,$file) || die "Oeffnen $file $!";while (<INFO>) { ($name,$vorname,$alter)=split (/,/); print "$vorname $name:$alter";}close (INFO);

Page 29: Tagesüberblick 3

29

#Lösung 3-2a #!perl -w$file='daten3-1.txt';$fileo='aufg3-2.out';open (INFO,$file) || die "Oeffnen $file $!";open (QWE,">$fileo") || die "Oeffnen $fileo $!";while ($a=<INFO>) { @infos=split (/,/,$a); print QWE join (';',@infos);}close (INFO);close (QWE);

Page 30: Tagesüberblick 3

30

#Lösung 3-2b

#!perl -w$file='daten3-1.txt';$fileo='aufg3-2.out';open (INFO,$file) || die "Oeffnen $file $!";open (QWE,">$fileo") || die "Oeffnen $fileo $!";while (<INFO>) {print QWE join (';',split (/,/))}close (INFO);close (QWE);

Page 31: Tagesüberblick 3

31

#Lösung 3-3 Seite 1

#!perl -w$file='daten3-2.txt';open (INFO,$file) || die "Oeffnen $file $!";$w=$wsum=$m=$msum=0;while (<INFO>) { ($a,$b,$gender,$age)=split (/,/);

Page 32: Tagesüberblick 3

32

# Lösung 3-3 Seite 2 if ($gender eq 'w'){ $w++; $wsum+=$age} elsif ($gender eq 'm'){ $m++; $msum+=$age} else{ print "Geschlechtsmerkmal $gender", " unbekannt\n"}}}close (INFO);print "Durchschnittsalter:\nW:", $wsum/$w,"\nM:",$msum/$m;

Page 33: Tagesüberblick 3

33

# Lösung 3-4

$file="daten3-2.txt";open(IN,$file) || die "Oeffnen von $file $!";while (<IN>){ chomp(); # wichtig wg. anhaengen tr/a-z/A-Z/; print substr($_." "x7,3,4),"\n";}close(IN);

Page 34: Tagesüberblick 3

34

#Lösung 3-5$file="daten3-2.txt";

open(IN,$file) || die "Oeffnen von $file $!";

while (<IN>){

chomp(); # sonst erwischt man \n mit

tr/a-z/A-Z/;

print substr((" "x6).$_,-6),"\n";

}

close(IN);

Page 35: Tagesüberblick 3

35

# Lösung 3-6$file='daten3-3.txt';$kette='auf';$zeilennr=0;open (XDF,$file) || die "Oeffnen $file $!";while ($fgh=<XDF>) { $zeilennr++; $a=index($fgh,$kette); if ($a > -1){ print "Zeilennummer: $zeilennr Position: $a\n"; }}close (XDF);

Page 36: Tagesüberblick 3

36

Hausaufgabe 3-1• Lesen Sie die Datei daten3-4.txt ein.

• Wenn in einer Zeile die Zeichenkette auf enthalten ist, geben sie die Zeilennummer und auf die Zeichenkette folgenden 4 Zeichen in die Datei ha3-1.out aus.

Page 37: Tagesüberblick 3

37

Lösung Hausaufgabe 3-1 Seite 1

#! perl -w

$file='daten3-4.txt';

$ofile='ha3-1.out';

$zeilennr=0;

open (XDF,$file) || die "Oeffnen $file $!";

open (RAUS,">$ofile") || die "Oeffnen $ofile $!";

Page 38: Tagesüberblick 3

38

Lösung Hausaufgabe 3-1 Seite 2while ($fgh=<XDF>) {

$zeilennr++;

chomp($fgh);

$a=index($fgh,'auf');

if ($a > -1){ # Wenn Suchstring vorhanden

print RAUS 'Zeilennummer: ',$zeilennr,

' vier folgende Zeichen: ',

,substr($fgh." "x4,$a+3,4),"\n"}}

close (RAUS);