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