Kontext bei Ausdrücken

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

Der Begriff Kontext ist in Perl sehr wichtig, und im besonderen für den Match-Operator. Ein Ausdruck kann im Wesentlichen in drei Arten von Kontexten vorkommen: im Listenkontext, im skalaren Kontext oder im Void-Kontext. Die Namen zeigen an, was für ein Typ von Resultat des Ausdrucks erwartet wird. Im Listenkontext wird also eine Liste von Werten erwartet, im skalaren Kontext ein einzelner Wert. Diese zwei kommen sehr häufig vor und sind auch für unser Thema der regulären Ausdrücke am wichtigsten. Beim Void-Kontext wird überhaupt kein Wert erwartet.

Bei den zwei Zuweisungen

$s = Ausdruck eins;
@a = Ausdruck zwei;

ist $s eine einfache skalare Variable (sie enthält einen einzigen Wert, nicht eine Reihe von Werten). Der erste Ausdruck, wie kompliziert er auch ist, steht daher in einem skalaren Kontext. Analog ist @a eine Array-Variable. Diese verlangt eine Liste von Werten, und der Ausdruck zwei steht in einem Listenkontext.

Die zwei Ausdrücke können identisch sein; sie können je nachdem völlig verschiedene Werte zurückgeben und auch verschiedene Nebeneffekte bewirken. Was genau passiert, hängt vom Ausdruck ab.

Betrachten wir als Beispiel die Funktion localtime. Im Listenkontext liefert sie eine Liste von Werten, die dem aktuellen Jahr, Monat, Tag, Stunde usw. entsprechen. Im skalaren Kontext gibt sie einen String zurück, der das gleiche Datum in Textform enthält, also etwa ›Mon Jan 20 22:05:15 2003‹.

Oder nehmen wir den Lese-Operator <DATEI> – dieser liest im skalaren Kontext die nächste Zeile der Datei und gibt sie zurück, im Listenkontext werden dagegen alle (restlichen) Zeilen der Datei gelesen und als Liste zurückgegeben.

Viele andere Operationen in Perl passen sich wie localtime und <DATEI> dem Kontext an. Bei den Regex-Operatoren ist das nicht anders – der Match-Operator beispielsweise gibt je nachdem nur einen booleschen Wert »Treffer/kein Treffer« zurück oder aber auch eine Liste von Treffer-Texten. Die Einzelheiten dazu werden später in diesem Kapitel erläutert.

Einen Ausdruck zurechtbiegen

Nicht jeder Ausdruck passt sich von sich aus an den Kontext an, deshalb gibt es in Perl Regeln, was mit einem allgemeinen Ausdruck passiert, wenn er in einem Kontext auftritt, für den er nicht vorgesehen ist. Manchmal biegt Perl den Ausdruck einfach zurecht, damit er in den Kontext passt.

Wenn in einem Listenkontext ein Skalar auftritt, macht Perl daraus einfach eine Liste mit einem Element. So ist dann @a = 42 exakt dasselbe wie @a = (42).

Umgekehrt funktioniert das nicht. Es gibt keine allgemeine Regel für die Konversion einer Liste in einen Skalar. Wenn einem Skalar eine literale Liste zugewiesen wird wie in

$var = ($das, &ist, 0xE, "i\n\e",  'Liste');

dann gibt der Komma-Operator das letzte Element zurück, hier 'Liste'. Wenn ein Array zugewiesen wird wie in $var = @array, dann wird die Länge (die Anzahl der Elemente) des Arrays zurückgegeben.

In anderen Programmiersprachen werden für dieses Zurechtbiegen Begriffe wie Cast, Typenkonversion oder Promotion benutzt. Für mich klingen diese viel zu konsistent (langweilig?), um das Verhalten von Perl adäquat zu beschreiben.

  

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