Perl ist eine der leistungsstärksten Sprachen für die Arbeit mit regulären Ausdrücken. Für Übereinstimmungen verwendet man die Operatoren =~ und !~.
Modifikatoren für reguläre Ausdrücke:
i — Groß-/Kleinschreibung wird ignoriertg — globaler Suchmodus (alle Vorkommen)m — mehrzeiliger Modus (arbeitet ^ und $ für jede Zeile)s — der Punkt (.) schließt das Zeilenende einBeispiel:
my $text = "Meine E-Mail: max@mail.com und ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "E-Mail: $1 "; }
In diesem Beispiel extrahiert die Schleife alle E-Mails aus dem String.
Nach der Übereinstimmung werden die Werte in speziellen Variablen $1, $2, ... (je nach erfasster Gruppe) gespeichert.
Was wird in der Variablen $1 nach einer fehlgeschlagenen Suche mit einem regulären Ausdruck gespeichert?
Antwort:
$1wird bei einem erfolglosen Treffer nicht aktualisiert — es behält den Wert der letzten erfolgreichen Übereinstimmung. Das kann eine potenzielle Fehlerquelle sein! Um dies zu vermeiden, sollte man in komplexen Bedingungen$1,$2, ... ausdrücklich leeren.
Geschichte
Die Validierung der Eingabedaten mit einem komplexen regulären Ausdruck hing vom Wert von
$1ab. Nach einer fehlgeschlagenen Übereinstimmung, bei der keine passende Zeichenfolge gefunden wurde, blieb die Variable$1unverändert und die Verarbeitung erfolgte mit der alten, falschen E-Mail-Adresse.
Geschichte
Der Programmierer machte einen Fehler mit dem Modifikator. In einem großen Text wurde
/abc/gverwendet, in der Annahme, dass der mehrzeilige Modus gilt. Infolgedessen fand das Muster keine benötigten Zeilen mit Zeilenumbrüchen, obwohl/abc/mshätte verwendet werden müssen.
Geschichte
Im Projekt wurde vergessen, das globale Flag
/gbei der Suche nach allen Vorkommen zu verwenden. Die Folge war, dass das Skript nur die erste Übereinstimmung extrahierte, während der Benutzer eine vollständige Liste der Daten erwartete.