Nadel im Heuhaufen
Reguläre Ausdrücke
Rückbesinnung in Perl
Perl beherrscht diese so genannten backward references natürlich perfekt. Innerhalb eines regulären Ausdrucks werden die numerischen Spezialvariablen \1 bis \9 mit dem Inhalt der Gruppen belegt. Zusätzlich erstellt Perl jedoch noch ganz normale Perl-Variablen, mit denen Sie auf die Fundstücke auch außerhalb des regulären Ausdrucks zugreifen können. Der Inhalt von \1 landet dabei in der Perl-Variablen $1, der Inhalt von \2 in $2 usw.
Ein kleines Beispiel aus einem primitiven Parser:
/^\s*From\s+(\w+)\s+Type\s+(\w+)\s+Seq\s+(\d+)\s+DB\s+(\w+)\s*$/i
or die "Invalid pattern in packet: \"$_\"";
my ($from, $type, $seq, $db) = ($1, $2, $3, $4);Jetzt enthalten die Variablen $from, $type, $seq und $db die jeweils gefundenen Strings. Bei der Eingabe
From mas Type ACK Seq 4219 DB Pharma
ist also $from = "mas", $type = "ACK", $seq = 4219 und $db = "Pharma".
Zusätzliche Perl-Funktionen
Unabhängig von Gruppen und Ähnlichem belegt Perl nach einer Suche noch weitere Variablen. Diese fasst Tabelle 3 zusammen.
Tabelle 3: Perl-Variablen nach einer erfolgreichen Suche
| Name | Bedeutung |
|---|---|
| $& | Der letzte gefundene String, also das, worauf die Regexp gepasst hat. |
| $` (Apostroph rückwärts) | Der Teil des Strings vor dem gefundenen Anteil. |
| $' (Apostroph vorwärts) | Der Teil des Strings nach dem gefundenen Anteil. Nach einer erfolgreichen Suche wird der gesamte durchsuchte String zerlegt in $`$&$'. |
| $+ | Die letzte passende Gruppe. Wenn Ihr regulärer Ausdruck mehrere Gruppenkonstrukte enthält, von denen einige optional sind, greifen Sie hiermit auf den Inhalt der letzten Gruppe zu. |
Ohne Zweifel ist die Regexp-Engine von Perl eine der leistungsfähigeren im Unix-Umfeld. Ein paar praktische Perl-Einzeiler ermöglichen das unkomplizierte Herumprobieren auch an der Kommandozeile.
Mit dem folgenden Befehl wirkt Perl als grep-Ersatz, dabei werden alle Zeilen ausgegeben, die den regulären Ausdruck abc enthalten:
perl -ne 'print if /abc/' dateiname.txt
Perl agiert auch als sed-Ersatz. Im Beispiel wird die Regexp abc durch den Text def ersetzt und das Ergebnis am Bildschirm angezeigt:
perl -pe 's/abc/def/g' dateiname.txt
Der nächste Befehl wirkt ähnlich, allerdings ersetzen wir abc innerhalb der Datei durch def und lassen Perl eine Sicherheitskopie in dateiname.txt~ erstellen:
perl -pi~ -e 's/abc/def/g' dateiname.txt
Grundsätzlich verwenden Sie in Perl m/regexp/ oder einfach /regexp/ für die einfache Suche. Zum Suchen und Ersetzen benutzen Sie s/regexp/Ersatztext/. Nach dem letzten Schrägstrich können Sie einen der Modifikatoren aus Tabelle 4 anhängen.
Tabelle 4: Modifikatoren für reguläre Ausdrücke in Perl
| Anhängsel an den letzten Schrägstrich | Bedeutung |
|---|---|
| /i | Suche ohne Beachtung von Groß- und Kleinschreibung. |
| /s | Der Punkt passt auch auf Zeilenumbrüche innerhalb des durchsuchten Strings. |
| /m | Der durchsuchte String darf mehrere Zeilen enthalten (ähnlich wie bei grep), wobei ^ und $ auch innerhalb des Strings immer für einen Zeilenanfang bzw. ein Zeilenende stehen. |
| /g | Beim Suchen und Ersetzen: Nicht nur die erste Fundstelle wird ersetzt, sondern alle im String. |



