Beziehungen des Match-Operators zum Umfeld
(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)
Die folgenden Abschnitte fassen zusammen, wie der Match-Operator seine Umgebung beeinflusst und wie er von der Umgebung beeinflusst wird.
Nebeneffekte des Match-Operators
Oft sind die Nebeneffekte eines Matchings wichtiger als das eigentliche Resultat. Es kommt tatsächlich recht häufig vor, dass ein Match-Operator im Void-Kontext für sich allein steht, ohne dass das Resultat überprüft oder einer Variablen zugewiesen wird; er wird nur um der Nebeneffekte willen verwendet (der Operator verhält sich dann so wie im Skalarkontext). Die folgenden Nebeneffekte entstehen bei einer erfolgreichen Mustersuche:
- Die »Treffervariablen« wie $1 und @+ werden für den aktuellen dynamischen Geltungsbereich gesetzt (mehr dazu unter Durch das Matching gesteuerte Spezialvariablen).
- Die voreingestellte Regex wird für den gleichen Geltungsbereich gesetzt (siehe Voreinstellung bei einem leeren Regex-Operanden).
- Wenn mit m?...? ein Treffer erzielt wird, wird für diesen spezifischen Match-Operator abgespeichert, dass er (bis zum nächsten reset im gleichen Package) nicht mehr passen kann (siehe Spezielle »Nur Einmal«-Mustersuche mit ?...?).
Noch einmal: Diese Nebeneffekte entstehen nur, wenn ein Treffer gefunden wurde. Bei einem Fehlschlag bleiben sie unberührt. Die folgenden Dinge passieren jedoch bei jeder Mustersuche, egal ob sie erfolgreich ist oder nicht:
- pos wird gesetzt – bei einem Fehlschlag auf den Anfang des Strings (siehe Die »aktuelle Position« und die pos()-Funktion).
- Wenn der /o-Modifikator benutzt wird, wird die Regex »versiegelt« und bei einer Wiederverwendung nicht neu evaluiert (siehe Der /o-Modifikator: »Nur einmal kompilieren«).
Einflüsse von außen auf den Match-Operator
Die Mustersuche mit dem Match-Operator hängt von mehr ab als nur von den Operanden und den Modifikatoren. In der folgenden Liste sind die weiteren Faktoren zusammengefasst:
Kontext
Der Kontext, in dem der Match-Operator verwendet wird (Skalar-, Listen- und Void-Kontext), hat großen Einfluss darauf, wie die Mustersuche vor sich geht, auf den Rückgabewert und auf die Nebeneffekte.
Aktuelle Position
Die aktuelle Position im Suchstring (sie wird entweder explizit mit pos(...) oder von einer früheren Mustersuche gesetzt) besagt, wo im String bei der nächsten Mustersuche mit /g begonnen wird. Das ist außerdem die Position, auf die ˹\G˼ passt.
Voreingestellte Regex
Bei einem leeren Regex-Operanden wird die voreingestellte Regex verwendet (siehe Voreinstellung bei einem leeren Regex-Operanden).
study
Hat keinen Einfluss auf die gefundenen Treffer oder den Rückgabewert, sondern nur darauf, wie schnell die Mustersuche abläuft. Wenn der Suchstring mit study vorbehandelt wurde, kann die Mustersuche schneller sein (oder auch langsamer). Siehe Die Funktion study.
m?...? und reset
Der unsichtbare Zustand des m?...?-Operators »hat bereits gepasst«/»hat nicht gepasst« wird verändert, wenn eine Mustersuche mit m?...? erfolgreich war oder wenn reset aufgerufen wird (siehe siehe Spezielle »Nur Einmal«-Mustersuche mit ?...?).
Was ist das für ein Kontext?
Abschließend zum Abschnitt über den Match-Operator eine Übungsaufgabe: Besonders bei while-, if- und foreach-Kontrollstrukturen muss man sehr genau aufpassen, welchen Kontext man gerade benutzt. Was gibt das folgende Programmstück aus?
while ("Eene Meene Muh" =~ m/\w+/g) {
print "WHILE raus ist $&.\n";
}
print "\n";
if ("Eene Meene Muh" =~ m/\w+/g) {
print "IF raus ist $&.\n";
}
print "\n";
foreach ("Eene Meene Muh" =~ m/\w+/g) {
print "FOREACH raus ist $&.\n";
}
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