Werbung einblenden Werbung ausblenden


Home / Tutorials / Perl Handbuch / Bearbeitung von Zeichenketten

Funktionen zur Bearbeitung von Zeichenketten
a.) Eine Zeichenkette an einem Delimiter aufspalten - split
b.) Das newline Zeichen (\n) am Ende der Zeile entfernen - chomp
c.) Jedes x-beliebige Zeichen am Ende einer Zeile entfernen - chop
d.) Aus einer Zeichenkette ein Teilstück ausschneiden - substr
e.) Hexadezimalzahlen in Ascii Zahlen konvertieren und den entsprechenden Buchstaben darstellen hex/pack
f.) Die Länge einer Zeichenkette ermitteln - length
g.)Ermitteln, wann eine Zeichenkette zum ersten, bzw. zum letzten Mal auftaucht:index,rindex

Funktionen zur Bearbeitung von Zeichenketten

Die wichtigsten Befehle zur Bearbeitung von Zeichenketten sind:
split, chop, chomp, substr, hex, pack, length
Eine Zeichenkette an einem Delimiter aufspalten - split

Insbesondere im Zusammenhang mit Flatfiles kommt es immer wieder vor, dass Informationen, die in einer Zeichenkette abgelegt sind, auseinander dividiert werden müssen. Ein Flatfile kann z.B. folgendes Aussehen haben

Name:Maier;Telefon:030-47301344;Ort:Berlin;Beruf:Schreiner
Name:Müller;Telefon:040-4564444;Ort:Hamburg;Beruf:Maurer
Name:Lehmann;Telefon:089-34534;Ort:Bremen;Beruf:Zimmermann

Nehmen wir an, die erste Zeile steckt in der Variablen $banane (Variablen haben in Perl ein Dollarzeichen).
Der Variablen $banane können wir den Wert der ersten Zeile zuweisen.

$banane="Name:Maier;Telefon:030-47301344;Ort:Berlin;Beruf:Schreiner";

Mit dem split Operator spalten wir an einem bestimmten Zeichen, einem Delimiter, eine Zeichenkette auf und übergeben die Einzelteile an einen Array.

@banane=split(";",$banane);
print $banane[0] und $banane[1] und $banane[2] und $banane[3];


@banane ist ein Array, vorstellbar als ein Schrank mit vier Schubladen.
In der ersten Schublade ist Name:Maier, in der zweiten Schublade Telefon:030-47301344, in der dritten Schublade Ort:Berlin und in der vierten Schublade Beruf:Schneider.
Soll nur auf ein einzelnes Element eines Arrays zugegriffen werden, schreibt man $banane[0] , $banane[1] etc.(es handelt sich dabei um skalare Variablen mit nur einem Wert). Das erste Element des Arrays ist übrigens das Element 0 und nicht 1. Das heißt, Name:Maier ist $banane[0].

Das newline Zeichen (\n) am Ende der Zeile entfernen - chomp

Sollen Flatfile Datenbanken ausgelesen werden, besteht das Problem, dass da am Ende ein \n, ein Newline Zeichen steht.
Warum der Programmierer dieses Newline Zeichen (\n ) verwendet, wird im Kapitel Arbeiten mit Textdateien ausführlich beschrieben.
Das \n Zeichen ist für alle folgenden Prozesse störend. Es muss folglich entfernt werden.
Chomp entfernt das \n Zeichen am Ende der Zeile.

$kirsche="Ene mene meck und du bist weg \n";
chomp($kirsche);


Ergebnis: Es bleibt nur noch "Ene mene meck und du bist weg" übrig.
Das Newline Zeichen stört zum Beispiel, wenn das Password so abgespeichert wird. Es wird in der Regel überprüft, ob das Password, das der User eingibt mit dem Password in der Datenbank übereinstimmt. Balduin z.B. entspricht aber nicht Balduin\n.
Hier noch ein kleines Skript:

$kirsche="der Gerechte lebt aus dem Glauben,\n";
print $kirsche."hat Immanuel Kant zumindest nie gesagt.";
chomp ($kirsche);
print $kirsche."Er sagte, Aufklärung ist die Befreiung des
Menschen aus seiner selbstverschuldeten Unmündigkeit.";

Man erhält dann nach dem ersten print:
der Gerechte lebt aus dem Glauben,
hat Immanuel Kant zumindest nie gesagt.


Es wird umgebrochen, \n ist also noch vorhanden. Das Auslösen des Skriptes nach dem zweiten print liefert:
der Gerechte lebt aus dem Glauben, hat Immanuel Kant zumindest nie gesagt. Er sagte, Aufklärung ist die Befreiung des Menschen aus seiner selbstverschuldeten Unmündigkeit.

Nach "Glauben," wird nicht mehr umgebrochen. \n ist also nicht mehr vorhanden. Der Punkt ist ein Konkatenationsoperator. Dieser verbindet Variablen und triviale Zeichenketten.

Jedes x-beliebige Zeichen am Ende einer Zeile entfernen - chop

chop entfernt jedes x-beliebige Zeichen am Ende:

$birne="Grün leuchtet der Baum";
chop($birne);
print $birne;

Was kommt da raus?
Grün leuchtet der Bau

Aus einer Zeichenkette ein Teilstück ausschneiden - substr

Mit substr kann aus einer Zeichenkette ein Teilstück ausgeschnitten werden.
Spaß macht das allerdings nur, wenn die genaue Struktur der Zeichenkette bekannt ist.
Bedauerlicherweise ist das aber meistens nicht der Fall, so dass die sehr viel mächtigeren Regular Expressions zum Einsatz kommen. Diese werden im Kapitel regular expressions ausführlich beschrieben.

$hase="Das schönste im Leben ist die Freiheit, denn dann sagen wir Hurra";
Aus dieser Zeile wollen wir jetzt das Wort Freiheit ausschneiden:

$osterhase=substr($hase,30,8);

$osterhase ist jetzt Freiheit. F ist der dreißigste Buchstabe. Bei F angefangen, werden noch 8 Buchstaben ausgeschnitten, wobei das F als Startpunkt mitzählt.

Das probieren wir jetzt aus:

$hase="Das schönste im Leben ist die Freiheit, denn dann sagen wir Hurra";
$osterhase=substr($hase,30,8);
print substr($hase,30,8)." is just another word for nothing left to loose";

Ergebnis:
Freiheit is just another word for nothing left to loose
Man beachte übrigens den Konkatenationsoperator. Er verbindet Variablen bzw. Rückgabewerte von Funktionen mit Zeichenketten.

Hexadezimalzahlen in Ascii Zahlen konvertieren und den entsprechenden Buchstaben darstellen hex/pack

hex alleine braucht eigentlich niemand, aber die Kombination mit pack ist sinnvoll.
hex konvertiert Hexadezimalzahlen zurück in Ascii Zahlen. Das ist im Internet an einer Stelle richtig wichtig. Der Query String stellt alles nicht in Ascii Code Vorliegende in Hexadezimalzahlen dar.
Also ü wird FC, Ü wird DC, ä wird E4 , Ä wird C4, ö wird F6, Ö wird D6 etc.
$kirsche=hex(FC);
ist dann 252.

Mit der pack Funktion kann zu der Zahl der entsprechende Buchstabe "rausgefischt" werden.
print pack("c",252);
liefert dann den Wert ü.
Die Ausführung des Befehls muss im Browser erfolgen, da die DOS Box Sonderzeichen nicht darstellen kann. Ein konkretes Beispiel, in dem das verwendet wird, ist im Kapitel Perl Routine zum Auslesen des QUERY_STRING beschrieben

Die Länge einer Zeichenkette ermitteln - length

Situationen, in denen es interessant ist, wie lange eine Zeichenkette ist, sind häufig. Z.B. will man wissen, ob eine bestimmte Usereingabe eine bestimmte Länge überschreitet etc.

Ein kleines Beispiel:

$kerl="You took my love for granted why, the show is over say good bye";
print "Madonna braucht ".length($kerl)." Buchstaben, um ihren Ex in die Pfanne zu hauen";
Ermitteln, wann eine Zeichenkette zum ersten, bzw. zum letzten Mal auftaucht:index,rindex

Interessant ist auch, wo eine bestimmte Zeichenkette startet:

$banane="
Gib von jenem Wein dem alten
der dem Landman Kraft verleiht
den ich will mit neuem Saume
zieren meines Lebens Kleid
mach mich trunken und entfremde
mich der Welt auf dass ich dann
dieser Welt verborgene Dinge
dir berichte edler Mann
Hafes, Wein ";

$zum_erstenmal=index($banane,"Wein");
$zum_letztenmal=rindex($banane,"Wein");
print "$zum_erstenmal \n";
print "$zum_letztenmal \n";

Index ermittelt, wo das Wort Wein zum erstenmal vorkommt und rindex, wo es zum letzten mal vorkommt.

vorhergehendes Kapitel