Reguläre Ausdrücke - Teil 2Perl

SeitenanfangSeitenendeNoch einmal der Substitute-Operator s///

Bereits im Grundkurs haben wir den Substitute-Operator s/// kennengelernt. Hier kommen noch ein paar Besonderheiten. Der Rückgabewert dieses Operators ist die Anzahl der Ersetzungen, die gemacht wurden ...

$text='Hxutx morgxn als xr bxinahx ...';

print $text."\n\n";

print "1. ".($ersetzungen=$text=~s/Y/Ypsilon/g)." Ersetzung(en) => '".$text."'\n";
print "2. ".($text=~s/x/e/)." Ersetzung(en) => '".$text."'\n";
print "3. ".($text=~s/x/e/g)." Ersetzung(en) => '".$text."'\n";

ergibt ...

Hxutx morgxn als xr bxinahx ...

1. Ersetzung(en) => 'Hxutx morgxn als xr bxinahx ...'
2. 1 Ersetzung(en) => 'Heutx morgxn als xr bxinahx ...'
3. 5 Ersetzung(en) => 'Heute morgen als er beinahe ...'

s/// liefert also undef zurück, falls nichts ersetzt wurde, und ansonsten die Anzahl der Ersetzungen - egal ob die global-Option gesetzt wurde oder nicht.

SeitenanfangSeitenende... und nochmal ///

Hingegen der Match-Operator arbeitet etwas anders. Dieser liefert nicht die Anzahl des Vorkommens zurück, sondern die 'gematchten' Substrings als Array:

$Tiere="12 Elefanten, 1 Maus, 4 Katzen";

@Tiere=$Tiere=~/\b[A-Z][a-z]*\b/g;
print join(" - ",@Tiere);
Elefanten - Maus - Katzen

Hier wird nicht die Anzahl, sondern das Gefundene zurückgeliefert ... (finde ich ganz gut, hätte bei s/// auch gemacht werden können). Verzichtet man auf die Option g wird nicht der gefundene String zuruückgeliefert, sondern eine 1, falls etwas gefunden wurde und sonst undef.

Verwendet man Klammern im regulären Ausdruck, so werden die Auswertungen der Klammern sukzessive zurückgegeben.

$x="_ xx/11 _ ya/12 _ zb/13";

@x=$x=~/.(([a-z]+)\/\d+)./g;
print "@x";
xx/11 xx ya/12 ya zb/13 zb

Klar? Also gut, zuerst wird das Ergebnis xx/11 der ersten Klammer (das wäre $1) des ersten Treffers in das Array geschrieben; anschließend die der zweiten (xx) etc. Nach dem ersten Treffer wird der zweite abgearbeitet (ya/12, ya); etc. Die Teile außerhalb der Klammern wird nicht an das Array übergeben.

SeitenanfangSeitenendeFunktionen im Substitute-Operator

Bis jetzt haben wir schon recht effektiv Teilstrings ersetzt mit Hilfe des Substitute-Operators. Doch das folgende Konsrukt öffnet uns Tür und Tor für alles, was man machen will. Wir kombinieren s/// mit einem Funktionsaufruf im zweiten Teil des Operators.

$text="heute ist der 10.12.2001";

$text=~s/(\d+\.)(\d+)\.(\d+)/$1." ".&month($2)." ".$3/e;
print $text;


sub month{
  ("Januar", "Februar", "Maerz",
   "April", "Mai", "Juni",
   "Juli", "August", "September",
   "Oktober", "November", "Dezember")[$_[0]-1];
}
heute ist der 10. Dezember 2001

Mit der Option e im s-Operator muss im 2. Teil ein Term stehen, der berechnet werden muss. Also grob gesprochen Perlcode. Darum ist es möglich dort auch einen Funktionsaufruf (im Beispiel &month($2)) unterzubringen. Somit kann man den zu ersetzenden Teilstring auch beliebig handhaben!


Seitenanfang FehlermeldungHilfe zur Fehlermeldung © 2001-2003 Email an den AutorPerl, Lehrstuhl Mathe II, Uni Bayreuth