Mehr String-Funktionen
Split
Eine sehr nützliche Funktion in Perl ist die split-Funktion.
Sie unterteilt einen String an definierten Stellen und kopiert die Teile
in einen Array. Diese Funktion verwendet reguläre Ausdrücke für die Trennstellen
und splittet die $_-Variable, falls nichts anderes spezifiziert
wird.
Sie funktioniert folgendermassen:
$info = "Benno:Müller:Kaufmann:Hauptstrasse 14";
@personal = split(/:/, $info);
Dies hat den gleichen Effekt, wie
@personal = ("Benno", "Müller", "Kaufmann", "Hauptstrasse 14");
Falls die Information in der $_-Variablen gespeichert ist, können wir einfach
schreiben:
@personal = split(/:/);
Falls die einzelnen Felder durch eine beliebige Anzahl von Doppelpunkten unterteilt
sind, können wir einen regulären Ausdruck verwenden. Der Code
$_ = "Hugo:Huber::dipl. math.:::Dammweg 2";
@personal = split(/:+/);
bedeutet das gleiche wie
@personal = ("Hugo", "Huber",
"dipl. math.", "Dammweg 2");
Hingegegen würde
$_ = "Hugo:Huber::dipl. math.:::Dammweg 2";
@personal = split(/:/);
den folgenden Array ergeben:
@personal = ("Hugo", "Huber", "",
"dipl. math.", "", "", "Dammweg 2");
Ein Wort kann in Buchstaben, ein Satz in Wörter und ein Paragraph in Sätze aufgeteilt
werden:
@chars = split(//, $word);
@words = split(/ /, $sentence);
@sentences = split(/\./, $paragraph);
Im ersten Fall wird der Null-String zwischen jedem Buchstaben erkannt, deshalb ist der
@chars-Array ein Array von Buchstaben, dh. ein Array von Strings der Länge 1.
substr
Eine weitere Funktion die auf Strings operiert ist die substr-Funktion.
Hier sind drei Beispiele, wie sie verwendet wird:
substr("Once upon a time", 3, 4); # returns "e up"
substr("Once upon a time", 7); # returns "on a time"
substr("Once upon a time", -6, 5); # returns "a tim"
Das erste Beispiel ergibt einen Substring der Länge 4, welcher an der 3. Stelle
beginnt. Beachte, dass der erste Buchstaben eines Strings den Index 0 hat!
Beim zweiten Beispiel wird der letzte Parameter, die Länge des Substrings, weggelassen.
Das Resultat ist ein Substring, welcher von der angegebenen Stelle bis zum Ende des
Strings reicht.
Das dritte Beispiel benützt einen negativen Index. Es ergibt einen Substring, der an der
6. Stelle vom Ende des Strings an 5 Buchstaben lang ist.
Falls der negative Index vor den Anfang des Stringes zeigt, wird Perl nichts
zurückgeben und eine Warnung ausgeben. Um das zu vermeiden, kann man einen
String verlängern unter Verwendung des x-operators,
den wir früher erwähnt haben. Zum Beispiel erzeugt der Ausdruck ("
"x30) erzeugt 30 Leerzeichen.
substr kann auch als lvalue verwendet werden (auf der linken Seite
einer Anweisung):
$str = "It's a Perl World.";
substr($str, 7, 4) = "Small"; # It's a Small World
substr($str, 13, 0) = "Perl "; # It's a Small Perl World
Uebung
Ein nützliches Werkzeug in der Verarbeitung von natürlichen Sprachen ist die
Konkordanz. Sie erlaubt die Darstellung einer bestimmten Zeichenfolge in ihrem
unmittelbaren Kontex. Zum Beispiel wird ein Konkordanzprogramm mit dem Suchstring 'the'
angewendet auf ein bestimmtes File die folgende Ausgabe erzeugen. Beachte die Darstellung
des Suchstringes in einer vertikalen Zeile.
discovered (this is the truth) that when he
t kinds of metal to the leg of a frog, an e
rrent developed and the frog's leg kicked,
longer attached to the frog, which was dea
normous advances in the field of amphibian
ch it hop back into the pond -- almost. Bu
ond -- almost. But the greatest Electrical
ectrical Pioneer of them all was Thomas Edi
Wir wollen ein solches Programm als Uebungsbeispiel für unser File roman5.txt mit dem Suchstring du schreiben. Beachte die
folgenden Hinweise:
- Das ganze File soll in einen Array eingelesen werden (dies ist natürlich im Allgemeinen
nicht angebracht, da das File sehr gross sein kann, aber wir wollen uns jetzt nicht darum
kümmern.) Jede Zeile des Files ist ein Element des Arrays.
- Die chop -Funktion mit einem Array
als Parameter schneidet den letzten Buchstaben jedes Array-Elementes
ab.
- Wie wir schon gesehen haben, kann der gesamte Array mit folgender Anweisung
zusammengefügt werden: $text = "@lines";
- Verwende die split-Funktion mit dem Suchstring als regulärer Ausdruck für die
Trennstelle, an welcher der Text unterteilt werden soll. Das Resultat ist ein Array aller
Substrings, welche vom Suchstring eingeschlossen sind.
- Drucke der Reihe nach jedes Arrayelement, den Suchstring und das nächste Arrayelement
aus
- Beachte, dass das letzte Element des Arrays @food den Index $#food hat.
Soweit so gut. Jedoch stehen die Suchstrings noch nicht untereinander in einer
Zeile. Um das zu erreichen benötigen wir die substr-Funktion.

|