Die Funktion study

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

Im Gegensatz zu Optimierungen in der Regex befasst sich study(...) genauer mit dem Suchstring und versucht, daraus Informationen zu gewinnen, die zur Optimierung beitragen können. Eine Regex (oder mehrere) kann diese Informationen benutzen, wenn sie auf den String angesetzt wird. Die Funktion wird meist etwa wie folgt benutzt:

while (<>) {
   study($_); # Der Standardsuchstring $_ wird genauer untersucht.
   if (m/Regex 1/) { ... }
   if (m/Regex 2/) { ... }
   if (m/Regex 3/) { ... }
   if (m/Regex 4/) { ... }
}

Die Arbeitsweise von study ist eigentlich ziemlich einfach, aber es ist nicht so einfach abzuschätzen, wann study wirklich etwas bewirkt. Es hat keinerlei Auswirkungen auf die Resultate eines Programms, das Programm braucht lediglich mehr Speicher und läuft entweder langsamer, gleich schnell oder schneller – Letzteres ist, was man mit study erreichen will.

Wenn ein String mit study behandelt wird, investiert Perl einiges an Zeit und Speicherplatz und erstellt eine Liste der im String vorkommenden Zeichen und der Positionen, an denen sie auftreten. Auf den meisten Systemen ist diese Liste viermal so groß wie der String selbst. Eine Regex kann diese Liste benutzen, aber nur, solange der String unverändert bleibt. Mit jeder Änderung des Strings wird die Liste ungültig. Außerdem wird sie überschrieben, wenn ein anderer String mit study bearbeitet wird.

Wie viel diese Vorbehandlung des Suchstrings einbringt, hängt sehr von der Art der Regex ab, die darauf angewendet wird, und von den dabei angewandten Optimierungen. Wenn man beispielsweise nach einem literalen String wie m/foo/ sucht, können sich enorme Unterschiede ergeben (bei sehr langen Suchstrings bis zum Faktor 10 000). Wenn aber der /i-Modifikator benutzt wird, ist diese gewaltige Verbesserung dahin; in der aktuellen Implementation verhindert /i jeden study-Gewinn (und auch andere Optimierungen).

Wann sollte man study nicht benutzen?

  • Benutzen Sie study nicht bei Suchstrings, die Sie später mit dem /i-Modifikator absuchen, oder wenn alle literalen Elemente in der Regex von ˹(?i)˼ oder ˹(?i:...)˼ beeinflusst werden. Diese machen alle Vorteile von study zunichte.
  • Benutzen Sie study nicht bei kurzen Suchstrings. Hier sollte die ganz normale Optimierung Verketten von Literalen genügen. Was genau sind »kurze« Strings? Das ist schwer zu entscheiden, und letztlich hilft nur das Ausprobieren mit Ihren Daten und Ihren regulären Ausdrücken. Als sehr grobe Faustregel verwende ich study nie, wenn der Suchstring nicht mindestens ein paar Kilobyte lang ist.
  • Der Aufwand für study lohnt sich nicht, wenn mit dem String nur wenige Matchings gemacht werden oder wenn der String gleich wieder modifiziert wird. Eine bessere Leistung ist vor allem dann zu erwarten, wenn der Aufwand durch viele Matching-Operationen mit dem String wieder hereingeholt werden kann. Bei nur wenigen Matchings überwiegt der Arbeitsaufwand für study die Einsparungen beim Matching.
  • Verwenden Sie study nur bei Suchstrings, die Sie mit regulären Ausdrücken absuchen, die »hervorgehobene« literale Elemente enthalten (siehe Literalen Text herausstellen). study bringt nur etwas, wenn ein Zeichen gefunden wird, das auf jeden Fall in einem Treffer vorkommen muss. (Man könnte denken, dass study auch die index-Funktion verbessern kann, aber so ist es nicht.)

Wo kann study wirklich helfen?

study ist dann von Nutzen, wenn ein großer Suchstring immer wieder abgesucht werden muss, ohne dass er dazwischen verändert wird. Ein gutes Beispiel ist das Filterprogramm, das ich beim Erstellen dieses Buches benutzt habe. Ich habe das Buch in einer selbst gezimmerten Sprache geschrieben, die durch diesen Filter in SGML übersetzt wird (das SGML wird danach in troff und schließlich in PostScript umgesetzt). In diesem Filter wird jedes Kapitel zu einem einzigen String (dieses Kapitel ist etwa 475 Kilobyte groß). Auf diesen String wird eine große Anzahl von Tests angewandt, die ungültige Formatierungen erkennen sollen. Diese Tests verändern den Text nicht, sie prüfen nur; und sie suchen meist nach literalen Strings – das ist die Situation, die auf study zugeschnitten ist.

  

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