Post on 06-Apr-2015
1
Tagesüberblick 4
• Lösung Hausaufgabe/Fragen
• Mustervergleiche
2
Mustervergleich
- Patternmatching
- Reguläre Ausdrucke / regular expressions
- erweiterte Möglichkeit nach Mustern in Zeichenketten zu suchen
3
Operatoren für Mustervergleich
m/Muster/[g][i][..] # match / finde
/Muster/[g][i][..] # m kann wegfallen falls /
# als Begrenzer verwendet # werden.
s/Muster/blabla/[g][i][n] # substitute/ersetze
# g: global i:ignore case n: Anzahl Substitutions
# Weitere Optionen vorhanden.
# Wirkt auf $_
4
Beispiel#!perl -w
$_="abcdefghiabcdefghi";
$result=/def/; # match
print "\$result:$result\n";
if (/def/){ print"drin\n" };
$result = s/efg/E F G /g; # substitute
print "\$result:$result\n"; # Anzahl Substitutions
print ;
5
Ergebnis
$result:1
drin
$result:2
abcdE F G hiabcdE F G hi
6
Beispiele
/XYZ/ # Suche XYZ
m/bac/ # Suche bac
m@/ab@ # Suche nach /ab
/bla/i # Suche bla ohne Berück-
# sichtigung von Groß- /
# Kleinschreibung
s/abc/def/ # Ersetze abc durch def
s/abc/def/g # Ersetze alle abc durch def
7
Bindung an andere Variablen
$zeile =~ /inhalt/ # zeile enthält inhalt?
$zeile !~ /inhalt/ # zeile enhält inhalt # nicht?
$zeile =~ m/inhalt/ # zeile enthält inhalt?
$zeile !~ m/inhalt/ # zeile enhält inhalt # nicht?
$zeile =~ s/a/b/ # ersetze alle a in Zeile
# durch b
8
Beispiel 1#!perl -w
$file = "daten";
open (INFO,$file) || die "Oeffnen $file $!";
while ($zeile=<INFO>) {
if ($zeile =~ /XYZ/) {
print $zeile;
}
}
close (INFO);
9
Beispiel 2#!perl -w
$file = "daten";
open (INFO,$file) || die "Oeffnen $file $!";
while (<INFO>) {
if (/XYZ/){
print;
}
}
close (INFO);
10
Beispiel 3 & 4#!perl -w
$file = "daten";
open (INFO,$file) || die "Oeffnen $file $!";
while (<INFO>) {if (/XYZ/){print}}
close (INFO);
open (INFO,$file) || die "Oeffnen $file $!";
while (<INFO>) {print if /XYZ/}
close (INFO);
11
Spezielle Zeichen (Platzhalter). # Jedes einzelne Zeichen außer newline
^ # Zeichenkettenanfang
$ # Zeichenkettenende
* # kein, ein oder mehrere Zeichen wie das
# vorherige Zeichen
+ # ein oder mehrere Zeichen wie das # vorherige Zeichen
? # kein oder ein Zeichen wie das # vorherige Zeichen
12
Beispiel
$file = "daten.txt";
open (INFO,$file) || die "Oeffnen $file $!";
while (<INFO>) {
if (/X.Z/) {print}# Beachte: keine
} # Konkatenation
close (INFO); # sondern Platzhalter
13
Übungen
t.e
^A
s$
als*
als+
als?
.*
^$
# Niemals das einschließen in delimiter // vergessen !!
# t Zeichen e: tae tee tce
# A am Zeichenkettenanfang
# s am Ende der Zeichenkette
# al und beliebig s: al als alss alsss ...
# als und beliebig s: als alss alsss ...
# al und kein oder ein s: al als
# Kein oder beliebige Zeichen außer newline
# Leere Zeichenkette
14
Aufgaben
4-1) Lesen Sie die Datei daten4-1.txt ein und geben Sie alle Zeilen aus, deren zweiter bis vierter Buchstabe „aus“ enthält ( z. B. Haus, Maus etc. )
4-2) Lesen Sie die Datei daten4-1.txt ein und ersetzen Sie jeweils die letzten drei Zeichen einer Zeile durch die Zeichenfolge xyz und geben alle Zeilen in eine zweite Datei aus.
15
Weitere Möglichkeiten: Klassen
[qjk] # Entweder q oder j oder k
[^qjk] # Weder q noch j noch k
[a-z] # Beliebiger Kleinbuchstabe
[^a-z] # Kein Kleinbuchstabe
[a-zA-Z] # Beliebiger Buchstabe
16
[a-z]+ # Mindestens ein Kleinbuchstabe
# Es können alle Vervielfacher
# verwendet werden
17
Weitere Möglichkeiten : Sonderzeichen
\n # Zeilenvorschub ( newline )
\t # Tabulator
\s # Whitespace ( Leerz., Tab., Newline )
\S # kein Whitespace
\d # Ziffer ( digit )
\D # keine Ziffer
\w # Buchstabe ( word ) [a-zA-Z] !keine Umlaute!
\W # kein Buchstabe
18
Weitere Möglichkeiten: Gruppen
\\ # Mit \ werden Zeichen maskiert
(H|Feldm)aus # Haus oder Feldmaus
(H|L|Kl)aus # Haus, L oder Klaus
# Mit Klammern gruppieren
# | = oder
19
Mustererkennung mit Variablen
$_="Haus\n";
$b="a";
if (/$b/) {print}; # Einfache Benutzung Variabler
if (/${b}u/) {print} # Variablen als Teilstring
s/H$b/Z${b}x/; # Auch im zweiten Feld
print;
s/$bu/u$b/; # FALSCH Variable $bu statt $b
# wird adressiert
20
Aufgaben
4-3) Lesen Sie die Datei daten4-1.txt ein und zählen Sie alle Zeilen, die ein x oder y enthalten.
4-4) Lesen Sie die Datei daten4-1.txt ein und zählen Sie alle Zeilen, die Laster oder Pflaster enthalten.
4-5) Lesen Sie die Datei daten4-1.txt ein und wandeln alle x oder X in Y um und geben das Ergebnis aus.
21
Aufgaben
4-6) Lesen Sie den Verzeichniseintrag, in dem die Beispieldateien enthalten sind, ein und geben Sie alle Dateien die die Erweiterung .pl haben aus.
4-7) Wie Aufgabe 4-6 nur berücksichtigen Sie die Möglichkeit, daß die Erweiterung auch in Groß- und Kleinbuchstaben geschrieben sein kann.
22
Hausaufgabe 4-1
• Lesen Sie die Datei daten4-1.txt ein und wandeln alle a in B um.
• Zählen Sie die Zeilen in denen dies passiert ist.
• Zählen Sie die Anzahl der Ersetzungen.
• Geben das Ergebnis aus
23
Lösung 4-1
#!perl -w
$file = "daten4-1.txt";
open (INFO,$file) || die "Oeffnen: $file $!";
while (<INFO>) {
if (/^.aus/) {print};
}
close (INFO);
24
Lösung 4-2
#!perl -w
$infile = "daten4-1.txt";
$ofile = ">output";
open (IN,$infile) || die "Oeffnen: $infile $!";
open (OUT,$ofile) || die "Oeffnen: $ofile $!";
while (<IN>){
s/...$/xyz/;
print OUT;
}
close (IN);
close (OUT);
25
Lösung 4-3a
$infile = "daten4-1.txt";
$count = 0;
open (IN,$infile) || die "Oeffnen: $infile $!";
while (<IN>){
if (/[xy]/) {$count++};
}
close (IN);
print "$count Zeilen mit x oder y sind drin.";
26
Lösung 4-3b
$infile = "daten4-1.txt";
$count = 0;
open (IN,$infile) || die "Oeffnen: $infile $!";
while (<IN>){
$count += /[xy]/;
}
close (IN);
print "$count Zeilen mit x oder y sind drin.";
27
Lösung 4-4
$infile = "daten4-1.txt";
$count = 0;
open (IN,$infile) || die "Oeffnen: $infile $!" ;
while (<IN>){
if (/(L|Pfl)aster/) {$count++};
}
close (IN);
print "$count Zeilen mit ..aster sind enthalten.";
28
Lösung 4-5a
$infile = "daten4-1.txt";
$count = 0;
open (IN,$infile) || die "Oeffnen: $infile $!";
while (<IN>){
$count += s/[xX]/Y/g; # Beachte das g
print;
}
close (IN);
print "Ersetzungen: $count";
29
Lösung 4-5b
$infile = "daten4-1.txt";
$count = 0;
open (IN,$infile) || die "Oeffnen: $infile $!";
while (<IN>){
$count += s/x/Y/gi;
print;
}
close (IN);
print "Ersetzungen: $count";
30
Lösung 4-6
#!perl -w
$infile = "dir |";
open (IN,$infile) || die "Oeffnen: $infile $!";
while (<IN>){
if (/\.pl$/){print}; # Beachte /\ ist nicht ^
}
close (IN);
31
Lösung 4-7
#!perl -w
$infile = "dir |";
open (IN,$infile) || die "Oeffnen: $infile $!";
while (<IN>){
if(/\.pl$/i){print}; # Beachte /\ ist nicht ^
}
close (IN);