Debugging-Informationen zu regulären Ausdrücken

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

Perl wendet eine große Anzahl von Optimierungen an, damit der Treffer so schnell wie möglich gefunden wird; die gängigeren dieser Optimierungstechniken werden im Abschnitt Übliche Optimierungen unter Die Kunst, reguläre Ausdrücke zu schreiben behandelt, es gibt aber etliche weitere. Viele Optimierungen sind nur auf ganz bestimmte Situationen anwendbar, und eine konkrete Regex profitiert immer nur von wenigen (oder von gar keiner).

In Perl gibt es Debugging-Optionen, die über bestimmte verwendete Optimierungen Auskunft geben. Wenn eine Regex übersetzt wird, bestimmt Perl, welche Optimierungen bei dieser Regex angewendet werden können. Im Debugging-Modus werden diese ausgegeben. Mit aktivierten Debugging-Optionen wird außerdem einiges darüber ausgegeben, wie die Maschine die Regex anwendet. Eine genaue Beschreibung aller ausgegebenen Debugging-Informationen würde den Rahmen dieses Buches sprengen; ich gebe hier nur eine kurze Einführung.

Sie können die Debugging-Informationen für reguläre Ausdrücke mit use re 'debug'; aktivieren und mit no re 'debug'; wieder ausschalten. (Wir hatten das use re-Pragma schon früher mit anderen Argumenten kennengelernt; mit use re 'eval'; erlaubten wir die Verwendung von Perl-Code in interpolierten Variablen, siehe den Kasten Codemuster interpolieren.)

Wenn die Debugging-Informationen für das ganze Skript ausgegeben werden sollen, kann man das Skript statt über den Namen auch mit der Befehlszeilen-Option -Mre=debug aufrufen. So kann man auch nur eine einzige Regex in einem Einzeiler testen (hier wurden einige weniger interessante Zeilen weggelassen):

% perl -cw -Mre=debug -e 'm/^Subject: (.*)/'
Compiling REx `^Subject: (.*)'
rarest char j at 3
   1: BOL(2)
   2: EXACT <Subject: >(6)
           ...
  12: END(0)
anchored `Subject: ' at 0 (checking anchored) anchored(BOL) minlen 9
Omitting $` $& $' support.

Bei Zeile 1 wird Perl auf der Befehlszeile mit folgenden Optionen aufgerufen: -c (Skript nur kompilieren, nicht ausführen), -w (Warnungen zu zweifelhaften Konstrukten ausgeben – immer benutzen!) und -Mre=debug (Debugging-Ausgabe aktivieren). Nach -e wird auf der Befehlszeile das iniatur-Perl-Programm ›m/^Subject: (.*)/‹ angegeben.

Auf Zeile 3 wird das »seltenste« (rarest) Zeichen (Perl verwendet eine statische Tabelle von Buchstabenhäufigkeiten) aus dem Substring-Teil der Regex bestimmt. Perl benutzt das für bestimmte Optimierungen wie die Suche nach einzelnen Zeichen oder festen Substrings.

Die Zeilen 4 bis 7 stellen die kompilierte interne Form der Regex dar. Wir vertiefen das hier nicht, aber Zeile 5 sieht eigentlich auch beim schnellen Überfliegen ganz verständlich aus.

Bei Zeile 8 passiert einiges. Hier können Informationen wie die folgenden ausgegeben werden:

anchored `String' at Offset

Bedeutet, dass ein Treffer den String ab Position Offset vom Beginn des Treffers aus haben muss. Wenn nach `String' direkt ein ›$‹ folgt, muss der Treffer mit String enden.

floating `String' at von . . bis

Bedeutet, dass ein Treffer den String enthalten muss, aber nicht an einer bestimmten Position, sondern er kann irgendwo zwischen von und bis beginnen. Wenn nach `String' direkt ein ›$‹ folgt, muss der Treffer mit String enden.

stclass `list'

Zeigt die möglichen Zeichen an, mit denen ein Treffer beginnen muss.

anchored(MBOL), anchored(BOL), anchored(SBOL)

Die Regex beginnt mit ˹^˼. Die MBOL-Version erscheint, wenn der /m-Modifikator aktiv ist, sonst BOL oder SBOL (BOL und SBOL sind in modernem Perl identisch; SBOL bezog sich auf die Variable $*, von deren Gebrauch seit Langem abgeraten wird).

anchored(GPOS)

Die Regex beginnt mit ˹\G˼.

implicit

Das anchored(MBOL) wurde von Perl implizit hinzugefügt, weil die Regex mit ˹.*˼ beginnt.

implicit Länge

Ein Treffer muss mindestens Länge Zeichen lang sein.

with eval

Die Regex enthält ˹(?{...})˼ oder ˹(??{...})˼.

Zeile 9 bezieht sich nicht auf eine bestimmte Regex und wird nur ausgegeben, wenn der Perl-Interpreter mit der Compiler-Option -DDEBUGGING übersetzt wurde. Wenn das ganze Programm geladen ist, gibt Perl hier aus, ob die Variablen $& usw. benutzt werden (siehe Die Variablen $`, $& und $' sind »unartig«).

Debugging-Informationen zur Laufzeit

Wir haben selbst Code entwickelt, mit dem wir Informationen über den Verlauf der Mustersuche zur Laufzeit ausgeben konnten (siehe Codemuster, die während der Mustersuche Informationen ausgeben), aber die Debugging-Optionen von Perl können das und noch mehr schon von Haus aus. Wenn die -c-Option weggelassen wird, gibt Perl eine ganze Menge von detaillierten Informationen über den Verlauf des Matchings aus.

Die Ausgabe »Match rejected by optimizer« bedeutet, dass schon das Getriebe festgestellt hat, dass die Regex nie passen kann. Die Regex wird gar nie angewendet. Ein Beispiel:

% perl -w -Mre=debug -e fl"Nur ein Test" =~ m/^Subject:/;'
    ...
Did not find anchored substr `Subject:'...
Match rejected by optimizer

Bei eingeschalteter Debugging-Option werden Informationen zu allen regulären Ausdrücken ausgegeben, nicht nur zu den eigenen. Im Beispiel

% perl -w -Mre=debug -e 'use warnings'
... jede Menge Debugging-Informationen ...
    ...

wird nur das warnings-Modul geladen. Weil aber dieses Modul reguläre Ausdrücke enthält, werden die Debugging-Informationen zu diesen ausgegeben.

Debugging-Informationen auf andere Art ausgeben

Mit »use re 'debug';« und -Mre=debug kann man Debugging-Informationen zu regulären Ausdrücken einschalten. Wenn debugcolor statt debug angegeben wird und das benutzte Terminal ANSI-Escape-Sequenzen versteht, werden diese Informationen durch Fettdruck und Ähnliches besser dargestellt.

Wenn der Perl-Interpreter mit der Compiler-Option -DDEBUGGING übersetzt wurde, kann man statt -Mre=debug auch die Befehlszeilen-Option -Dr verwenden.

  

<< 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