Nebeneffekte bei erfolgreicher Mustererkennung

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Erweitern wir das Programm, sodass der Benutzer Fahrenheit oder Celsius eingeben kann. Er muss dazu ein C oder ein F nach der Temperatur angeben. Damit unser regulärer Ausdruck das versteht, hängen wir einfach ein ˹[CF]˼ an; doch nun müssen wir den Rest des Programms so anpassen, dass erkannt wird, ob Fahrenheit oder Celsius eingegeben worden ist, und die jeweils andere Temperatur berechnet wird.

Unter Einführung in reguläre Ausdrücke hatten wir gesehen, dass manche Versionen von egrep die Metazeichen ˹\1˼, ˹\2˼ , ˹\3˼ usw. innerhalb der Regex unterstützen. Auch in Perl und in den meisten modernen Sprachen, die mit regulären Ausdrücken arbeiten, werden diese unterstützt, außerdem gibt es bei diesen Sprachen eine Möglichkeit, auf den Text zuzugreifen, der zu den Angaben innerhalb von Klammern einer Regex gepasst hat.

Wie das in anderen Sprachen gehandhabt wird, werden wir unter Features und Dialekte sehen. In Perl heißen diese Variablen $1, $2, $3 usw. Sie beziehen sich auf den Text, auf den der erste, zweite bzw. dritte geklammerte Unterausdruck gepasst hat. So merkwürdig sie aussehen, es sind Variablen; die Namen sind hier einfach Zahlen. In Perl werden diese Variablen gesetzt, wenn ein regulärer Ausdruck erfolgreich gepasst hat.

Zur Wiederholung: Das Metazeichen ˹\1˼ wird innerhalb eines regulären Ausdrucks benutzt, um auf Text zuzugreifen, der früher im gleichen regulären Ausdruck erkannt wurde; die Variable $1 dagegen wird außerhalb der Regex, nach der Mustersuche, für den gleichen Zweck benutzt.

Damit wir uns auf die Neuerungen konzentrieren und unser Beispiel übersichtlich halten, verzichte ich vorübergehend auf den Teil, der sich mit Nachkommastellen befasst. Um den Gebrauch von $1 zu illustrieren, vergleichen wir

$celsius =~ m/^[­+]?[0­9]+[CF]$/

und

$celsius =~ m/^([­+]?[0­9]+)([CF])$/

Ändern die zusätzlichen Klammern die Bedeutung des regulären Ausdrucks? Nun, dazu müssen wir überprüfen, ob die Klammern für den Stern oder andere Quantoren Gruppen bilden oder ob sie Alternativen (˹|˼) begrenzen. Die Antwort lautet in beiden Fällen nein, und damit erkennen die zwei regulären Ausdrücke dasselbe. Der zweite Ausdruck hat Klammern, weil diese sich auf »interessante« Teile des untersuchten Strings beziehen. Wie die folgende Abbildung zeigt, wird $1 die eingegebene Zahl enthalten und $2 den eingegebenen Buchstaben, C oder F. Das Flussdiagramm in der übernächsten Abbildung zeigt, wie wir nach der Mustererkennung fortfahren müssen.

Mit Klammern Textteile auffangen

Abbildung: Mit Klammern Textteile auffangen.

Flussdiagramm zur Temperatur-Umwandlung

Abbildung: Flussdiagramm zur Temperatur-Umwandlung.

Temperatur-Konversionsprogramm.


print "Geben Sie eine Temperatur ein (z.B. 32F, 100C):\n";
$eingabe = <STDIN>; # liest eine Eingabe-Zeile
chomp($eingabe);    # entfernt das Newline von $eingabe
if ($eingabe =~ m/^([­+]?[0­9]+)([CF])$/)
{      
      # Mustererkennung war erfolgreich. $1 ist die Zahl, $2 ist "C" oder "F".
      $EingabeZahl = $1; # in benannte Variablen kopieren, ...
      $Typ = $2;         # ... damit der Rest des Programms lesbarer wird.
      if ($Typ eq "C") { # ›eq‹ vergleicht zwei Strings
            # Eingabe war in Celsius, also Fahrenheit berechnen
            $celsius = $EingabeZahl;
            $fahrenheit = ($celsius * 9 / 5) + 32;
      } else {
            # Kein "C", muss daher ein "F" sein, also Celsius berechnen
            $fahrenheit = $EingabeZahl;
            $celsius = ($fahrenheit ­ 32) * 5 / 9;
      }
      # Hier haben wir beide Temperaturen, Resultat ausgeben:
      printf "%.2f C = %.2f F\n", $celsius, $fahrenheit;
} else {
      # Regex passt nicht: Warnung ausgeben.
      print "Zahl, gefolgt von \"C\" oder \"F\", erwartet,\n";
      print "nicht \"$eingabe\".\n";
}

Wenn die Datei mit dem Programm auf der vorherigen Seite konvert heißt, wird es wie folgt benutzt:

% perl ­-w konvert
Geben Sie eine Temperatur ein (z.B. 32F, 100C):
39F
3.89 C = 39.00 F
% perl -­w konvert
Geben Sie eine Temperatur ein (z.B. 32F, 100C):
39C
39.00 C = 102.20 F
% perl -­w konvert
Geben Sie eine Temperatur ein (z.B. 32F, 100C):
oops
Zahl, gefolgt von "C" oder "F", erwartet,
nicht "oops".

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln