IMS Einführung in Perl Operatoren - Richtigstellung Mustersuche II Universität Stuttgart Institut für maschinelle Sprachverarbeitung http://www.ims.uni-stuttgart.de/lehre/teaching/2003-ws/perl/home.html Heike.Zinsmeister@ims.uni-stuttgart.de Wintersemester 03/04 Übersicht 1. Richtigstellung bzgl. Operatoren 2. Wortverankerung Ergänzungen 3. locale-pragma 4. Speicherfunktionen 5. Präzedenz in Suchmustern 6. Varianten des Mustervergleich-Operators 7. Ersetzungsoperator s/// 8. Standardverhalten von reg. Ausdrücken ändern Typeset by FoilTEX Perl, 07.11.03 Mustersuche II 1 IMS IMS Richtigstellung Operatoren (1) a && b oder a AND b ist a wahr? nein: Abbruch, Rückgabe: a ja: ist b wahr? nein: Abbruch, Rückgabe: b ja: Ende, Rückgabe: b Logische Auswertung, z.b. im Bedingungskontext von if oder while. Nur dann wahr, wenn beide Konjunkte wahr. $wert = "ja" && "nein"; # nein $wert = 0 && "nein"; # 0 $wert = "nein" && "" ; # (leerer String) Perl, 07.11.03 Mustersuche II 2 Richtigstellung Operatoren (2) a b oder a OR b ist a wahr? ja: Ende, Rückgabe: a nein: ist b wahr? nein: Abbruch, Rückgabe: b ja : Ende, Rückgabe: b dann wahr, wenn eines der beiden Konjunkte wahr. Kurzschluß bei erstem wahren Konjunkt. $wert = "ja" "nein"; # ja $wert = 0 "nein"; # nein $wert = 0 "" ; # "" (leerer String) $wert = "" 0 ; # 0 Perl, 07.11.03 Mustersuche II 3
Musterverankerung - Ergänzungen (2) b/ b... Wortanfang und Wortende / B/ B... Nicht-Wortanfang oder -ende / b/ Ein Buch im Regal Dort steht das Buch. Ein Bilder-Buch? Eine Buch-Ausstellung Ein Bilderbuch? # Kein Match! Eine Buchausstellung? # Kein Match! bbuch / b/ Himbeereis! Himbeereises! sehr eisig# Kein Match! Beis(e es)? / Perl, 07.11.03 Mustersuche II 5 Speicherfunktionen 1. Rückwärtsreferenz innerhalb von Suchmustern 2. Speichervariablen Perl, 07.11.03 Mustersuche II 7 Musterverankerung - Ergänzungen (1) Anker markieren Positionen, nicht Zeichen A).../ (auch Zeilenbeginn / Z) z, Zeilenende /...$/ (auch Matcht genau genommen nicht auf Zeilen, sondern Einlesestrings Zeilenendeverankerung ist nicht sensitiv bzgl. Newlinezeichen /muster$/ findet...muster und...muster n Perl, 07.11.03 Mustersuche II 4 locale-pragma Pragmas sind Hinweise an den Compiler locale: Get locale-specific information. z.b. Anordnung von Zeichen im Alphabet (Umlaute!) Wertemenge von Klasse w siehe perldoc perllocale ( e am Ende ist wichtig) Beispiel: w*e/ /S use locale Söhne = ohne kein Match mit Match Perl, 07.11.03 Mustersuche II 6
Rückwärtsreferenz (2) Klammernbezug: von links nach rechts /(" )[^\1]*\1/ -> findet Wörter in passenden Anführungsstriche -> " wilma " /((fred wilma) f.) \2/ -> "fred f. fred" # Match -> "wilma f. wilma" # Match -> "fred f. wilma" # kein Match! Perl, 07.11.03 Mustersuche II 9 Speichervariablen (2) if ($in =~ /fred (wilma)/){ $w = $1; print "Ich habe $w gefunden.\n"; # wenn z.b. $in = "fred wilma\n" # Ausgabe: # "Ich habe wilma gefunden." Perl, 07.11.03 Mustersuche II 11 Rückwärtsreferenz (1) runde Klammern gruppieren und speichern Wiederaufruf innerhalb von Suchmuster Notation: Klammerung... Backslash-Zahl, z.b. /(abc) 1/ zwei beliebige Zeichen zwei identische Zeichen 2 beliebige Zeichensequenzen, durch Leerzeichen getrennt ]*)/ 1/ ]*) ([ /../ /(.) /([ 2 identische Zeichensequenzen, durch Leerzeichen getrennt 1/ ]*) /([ Perl, 07.11.03 Mustersuche II 8 Speichervariablen (1) wie Rückwärtsreferenz, nur nach beendeter Mustererkennung d.h. außerhalb von /.../ Notation: Klammerung in Mustersuche, Wiederaufgreifen mit Dollar-Zahl, z.b. /(abc)/...$1 Speichervariable oft innerhalb der {-Anweisung einer if-bedingung Perl, 07.11.03 Mustersuche II 10
Speichervariablen (3) Wenn Klammern nur gruppieren, aber nicht speichern sollen: (?:...) while ($in = <> ){ chomp($in); if ($in =~ /^([^ ]+) (?:und oder)? ([^ ]+)/) { $w1 = $1; $w2 = $2; print "Wort 1 = $w1, Wort 2 = $w2.\n"; Perl, 07.11.03 Mustersuche II 13 Automatische Speichervariablen (2) # /usr/bin/perl -w while ($in = <>){ chomp ($in); if ($in =~ /\b(a\w*)\b/) { print "Gefunden: $ <$&>$ \n"; # findet alle gross= # geschriebenen Woerter # mit A und zeigt sie mi # Kontext an Perl, 07.11.03 Mustersuche II 15 Speichervariablen (3) Klammern zählen von links nach rechts hoch. while ($in = <> ){ chomp($in); if ($in =~ /^([^ ]+) ([^ ]+)/) { $w1 = $1; $w2 = $2; print "Wort 1 = $w1, Wort 2 = $w2.\n"; Perl, 07.11.03 Mustersuche II 12 Automatische Speichervariablen (1) $& Stringteil, das auf Muster zutrifft $ alles davor (auf der eingelesenen Zeile) $ alles danach (auf der eingelesenen Zeile) Beispiel: KWIC-Format (KeyWord In Context) Perl, 07.11.03 Mustersuche II 14
Präzedenz in Suchmustern - Beispiele /^fred barney$/ # Alternation: "fred am Stringanfang" o # "barney am Stringende" /^(fred barney)$/ # "fred" oder "barney" als einziges # Element des Strings /fred barney/ # "fred" oder "barney" irgendwo /(wilma pebbles?)/ # "wilma" oder "pepple" oder "pepples" /^(\w+)\s+(\w+)$/ # Zeile mit genau zwei Zeichensequenzen Perl, 07.11.03 Mustersuche II 17 Ersetzungsoperator s/// Funktion: Suche und Ersetze Syntax: s/gesuchtes Muster/wird ersetzt durch diesen Text/ Beispiele (siehe Schwartz & Phoenix 2002: 138) $in = "gruener schuppiger Dinosaurier"; $in =~ s/(\w+) (\w+)/$2 $1/; $in =~ s/^/riesiger, /; $in =~ s/,.*uener//; $in =~ s/riesiger/roter/; $in =~ s/ \w+$/ ($!)$&/; $in =~ s/roter/gigantischer/; print "$in\n"; # gigantischer (roter!) Dinosauri Perl, 07.11.03 Mustersuche II 19 Präzedenz in Suchmustern Zeichen Erklärung () runde Klammern *,+,?,{n,m Quantifizierer Bezug auf unmittelbar vorangehendes Element /, $/, b, B, abc123 Anker und Zeichenfolgen Balken für Alternativen Perl, 07.11.03 Mustersuche II 16 Varianten des Mustervergleich-Operators /.../ ist Kurzform für m/.../ (m = matching) Musterbegrenzungszeichen sind eigentlich beliebig d.h. m/.../ gleich m{... gleich m!...! etc. Ausweich auf alternative Musterbegrenzung z.b., wenn Suchstring viele Slashes / enthält if ($var =~ m"#! /usr/bin/perl -w" { # " " als Begrenzung Anweisung; # des Musters Perl, 07.11.03 Mustersuche II 18
Standardverhalten von reg. Ausdrücken ändern Beispiele (1) $in = "BlaBla"; # Eingangswert soll jeweils # bei allen Ersetzungen gelten $in =~ s/bla/\lbla/; # "blabla" $in =~ s/bla/\lbla/g; # "blabla" $in =~ s/bla/\ubla/g; # kein Match $in =~ s/bla/\ubla/gi; # "BlaBla" Perl, 07.11.03 Mustersuche II 21 Referenzen Buchmanuskript http://www.perlmonk.org, Kapitel 3 Schwartz R. und T. Phoenix, 2002. Einführung in Perl. O Reilly, Kapitel 7 9 weiterführende Literatur: Friedl J. E. F., 2002. Mastering Regular Expressions O Reilly. Perl, 07.11.03 Mustersuche II 23 Standardverhalten von reg. Ausdrücken ändern markiert durch nachgestellte Flags oder Option-Modifier Übersicht auf Manpage perlop n /.../i ignoriert Groß-und Kleinschreibung / bja b/i findet ja oder Ja /.../s macht aus. die Klasse [ d D] d.h. Wildcard. findet alle Zeichen, auch /.../g findet alle Vorkommnisse eines Musters solange sich die Vorkommnisse nicht überschneiden s/alt/neu/g; /.../e wertet Ersatztext-Operanden des Substitutionsoperators als Perlcode aus Perl, 07.11.03 Mustersuche II 20 Standardverhalten von reg. Ausdrücken ändern Beispiele (2) $in = "time"; # Eingangswert soll jeweils # bei allen Ersetzungen gelten $in =~ s/time/localtime/g; # "localtime" $in =~ s/time/localtime/eg; # "Thu Nov 6 17:32:15 2003" $variable = 42; $in = "BlaBla"; $in =~ s/blabla/$variable-2/g; # "42-2" $in =~ s/blabla/$variable-2/eg; # "40" Perl, 07.11.03 Mustersuche II 22