Der Suchtext-Operand

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

Die normale Art zu sagen: »Das ist der Text, der abgesucht werden soll« ist die Verwendung von =~, also etwa $text =~ m/.../. Dieses =~ ist kein Zuweisungsoperator, und es ist auch kein Vergleichsoperator. Es ist einfach eine etwas merkwürdige Zeichenkombination, die Suchtext und Regex verknüpft (die Notation ist von awk inspiriert).

Weil das ganze Konstrukt »Ausdruck =~ m/.../« selbst wieder ein Ausdruck ist, kann man es überall verwenden, wo ein Ausdruck zugelassen ist. Ein paar Beispiele:

$text =~ m/.../;   # Simples Matching, wahrscheinlich wegen der Nebeneffekte.

if ($text =~ m/.../) {
  # Wird ausgeführt, wenn ein Treffer gefunden wird.
  .
  . 
  .
 

$ok = ( $text   =~ m/.../ ); # $ok erhält das Resultat des Matchings.
$ok =   $text   =~ m/.../  ; # Wie oben; =~ bindet stärker als = .

$resultat =   $text;            # Kopiere $text in $resultat ...
$resultat             =~ m/.../ ; # ... wende Regex auf $resultat an.
( $resultat = $text ) =~ m/.../ ; # Beides in einem Ausdruck.

Der Standardsuchtext $_

Wenn der Suchtext-Operand die Variable $_ ist, kann man das »$_ =~« gleich weglassen: $_ ist der Standardsuchtext, der voreingestellte Suchtext-Operand.

Ein Ausdruck wie

$text =~ m/Regex/;

bedeutet: »Wende Regex auf den Text in $text an, ignoriere das Resultat, aber setze die Nebeneffekte trotzdem.« Wenn die ›~‹ vergessen wird, bedeutet das daraus entstandene

$text = m/Regex/;

»Wende Regex auf den Text in $_ an, und speichere das Resultat (wahr oder falsch) in $text«. Mit anderen Worten: Diese zwei Zeilen sind äquivalent:

$text =        m/regex/;
$text = ($_ =~ m/regex/);

Die Verwendung des Standardsuchtexts ist vor allem dann sehr praktisch, wenn auch andere Sprachkonstrukte die gleiche Standardvariable $_ verwenden (viele tun das). Eine Konstruktion wie die folgende sieht man recht häufig:

while (<>)
{
   if (m/.../) {
     .
     . 
     .
   } elsif (m/.../) {
     .
     . 
     .

Im Allgemeinen wird aber ein Programm, das sich zu sehr auf Voreinstellungen verlässt, für den weniger geübten Programmierer undurchsichtig.

Das Resultat der Mustersuche negieren

Mit !~ statt =~ wird der Rückgabewert der Mustersuche ins Gegenteil verkehrt. (Mit Rückgabewerten und anderen Nebeneffekten befassen wir uns gleich; mit !~ ist der Rückgabewert ein einfaches »wahr« oder »falsch«.) Die folgenden drei Formen sind äquivalent:

if ($text !~ m/.../)
if (not $text =~ m/.../)
unless ($text =~ m/.../)

Ich mag die mittlere Variante am meisten. Alle drei haben die gleichen Nebeneffekte wie $1 usw. !~ ist eigentlich nur eine syntaktische Annehmlichkeit in einer Situation, in der etwas nicht passen soll.

  

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