Strings sind nichts anderes, als eine Kette von Zeichen, die bei Perl und bei
vielen anderen Programmiersprachen auch innerhalb von doppelte bzw. einfache Anführungszeichen gestellt werden ...
print "Ich bin ein String der skalaren Variable str\n";
print 'Man kann mich auch so schreiben' ;
Strings werden auch in skalare Variablen zwischengespeichert ...
$str="Ich bin ein String der skalaren Variable str\n";
$str= ' Man kann mich auch so schreiben ' ;
Für Viele, die bereits Erfahrung mit anderen Programmiersprachen haben, ist dies ein wenig verwirrend, dass man in Perl alle Datentypen in einen Topf wirft. Beispielsweise folgendes Beispiel ...
$str="Hallo Welt\n";
$var=100;
... müsste man in der Programmiersprache C folgendermaßen schreiben ...
char str[]="Hallo Welt\n";
int var=100;
Nun gibt es aber in Perl noch weitere Möglichkeiten Strings zu definieren.
Eine Möglichkeit währe mit dem q für Quoting. Wofür?
Nun eigentlich nur aus Bequemlichkeitsgründen würde ein C-Programmierer sagen.
Denn anstatt ...
$str="Hallo \"Welt\"\n";
... wo das Welt in Anführungsstrichen, mit Hilfe des Escape-Operators (Steuerungszeichen \
) ausgegeben werden soll, geschieht dies mit Hilfe des Quoting folgendermaßen
...
#!/usr/bin/perl -w
$str=q%Hallo "Welt"%;
print $str,"\n";
print q%Dies funktioniert auch so%,"\n";
print qq§"Der gesamte Text in Anführungszeichen"§;
Wir ersparen uns hiermit die Steuerzeichen, zur Ausgabe der Sonderzeichen in Perl. Die Darstellung mit dem einfachen q ist also gleich mit ...
print %qHallo Welt \n%;
print 'Hallo Welt\n';
Und die zweite Definition die Sie im Programm mit qq§........§; gesehen haben, ist gleich zu ...
print qq§"Der gesamte Text in Anführungszeichen \n"§;
print "\"Der gesamte Text in Anführungszeichen\" \n";
Also steht q für das Quoting von einfachen Anführungszeichen und qq für
doppelte Anführungszeichen.
Und es gibt noch eine weitere Möglichkeit Zeichenketten zu definieren (Perl gilt nicht umsonst als Weltmeister der
Textverarbeitung).
Man kann eine Zeichenkette auch anstatt zwischen Symbolen, zwischen zwei Gleichnamige Bezeichner einschließen. Dies sieht dann so aus ...
<<HERE_DUMDIDU; #Beginn der Zeichenkette
Die ist die Möglichkeit mittels <<HERE_bezeichner einen
Text auf dem Bildschirm auszugeben.
HERE_DUMDIDU #Ende der Zeichenkette
Man spricht dabei von Hier-Dokumenten. Diese werden mit den Zeichen << und einem
HERE ohne Zwischenraum eingeleitet ...
<<HERE_... #richtig
<< HERE_ #falsch
... und Abgeschlossen wird der Text mit der Zeichenfolge HERE und dem
Bezeichner, am Anfang einer neuen Zeile. Den Bezeichner können Sie
selber festlegen. Jetzt noch ein Skript dazu ...
#!/usr/bin/perl -w
$text=<<HERE_HOWDI;
Eine weitere Möglichkeit des Weltmeisters der Textverarbeitung
Texte ausgeben zu lassen bzw. einer skalaren Variablen zuzuweisen.
Der Text wird auch formatiert ausgegeben.
HERE_HOWDI
print $text, "\n";
Es ist übrigens egal ob Sie schreiben ...
$text=<<here_bezeichner.........
$text=<<HerEbezeichner..........
$text=<<herEBEZEICHNER..........
Aus Übersichtlichkeitsgründen bietet sich aber in diesem Fall Großschreibung an.
Nun folgen einige String-Funktionen zum bearbeiten von Zeichenketten. Zuerst eine Funktion, die ziemlich häufig eingesetzt wird. Das
Aneinanderreihen von Zeichenketten ...
$string=" Mit" . " dem" . " .-Operator" . " können" . " wir" .
" einzelne" . " Strings" . " Aneinanderreihen\n";
print $string;
Mit diesem .-Operator können Sie einzelne Strings aneinander hängen. Natürlich funktioniert dies auch mit Zahlen da ja Perl nicht zwischen Zahlen und Strings unterscheidet.
Es sind ja alles skalare Variablen. Hierzu ein Beispiel ...
#!/usr/bin/perl -w
$var=100;
$str="Dies funktioniert aber auch " . $var .
"%-ig mit Zahlen und Strings gemischt\n";
$text=<<HERE_HOWDI;
Eine weitere Möglichkeit des Weltmeisters der Textverarbeitung
Texte ausgeben zu lassen bzw. einer skalaren Variablen zuzuweisen.
Der Text wird auch formatiert ausgegeben.
HERE_HOWDI
$text=$text . q%Mit diesem "Punkt" ist Möglich, einen String an den anderen zu hängen%;
print $text, "\n";
print $str;
C-Programmierer können diesen .-Operator mit der Funktion strcat
vergleichen.
Das Aneinanderhängen von Strings, wird übrigens Konkatenation genannt.
Wenn Sie nun ein Zeichen oder einen Text mehrfach Aneinanderreihen wollen, also immer die selbe Text- bzw. Zeichenfolge Wiederholen wollen, können
Sie dies mit dem x-Operator machen ...
#!/usr/bin/perl -w
$linie='#' x 30; #es werden 30 '#' ausgeben
$sharp='#';
$leer=' ' x 28; #es werden 28 Leerzeichen ausgegeben
print $linie,"\n";
print $sharp . $leer . $sharp,"\n";
print $sharp . $leer . $sharp,"\n";
print $sharp . $leer . $sharp,"\n";
print $linie, "\n";
#Es wird ein Rechteck mit '#' ausgegeben
Natürlich können Sie dies einfacher mit Schleifen bewerkstelligen aber dazu kommen wir noch.
Mit der Funktion length bekommen Sie die Länge eines Strings ohne abschließendes Terminierungs-Zeichen (\0) zurück. C-Programmierer kennen diese Funktion unter dem Namen
strlen. Hier ein Beispiel zu length mit 2 verschiedenen Möglichkeiten der Anwendung ...
#!/usr/bin/perl -w
$string=0;
$laenge=0;
print "Bitte geben Sie ein Zeichenfolge ein : ";
chomp($string=<STDIN>);
$laenge=length $string;
printf qq§Sie haben "%d Zeichen" eingeben\n§,$laenge;
printf "Genau %d Zeichen\n", length $string;
In diesem Beispiel werden Sie aufgefordert, eine Eingabe zu machen und bekommen
anschließend die Anzahl Zeichen, die Sie eingegeben haben, mit der Funktion length zurück.
Wenn Sie von einem Zeichen den Zahlencode benötigen oder umgekehrt, so
können Sie die Funktionen
chr und ord verwenden. Mit chr erhalten von einem Zahlencode das Zeichen und mit ord erhalten von einem Zeichen den Zahlencode ...
#!/usr/bin/perl -w
printf qq§Zahlencode von "A" ist %d\n§,ord('A');
print "Das Zeichen zum Zahlcode 99 ist " . chr(99) . "\n";
Um in einem Text nach einer bestimmten String- oder Stringfolge zu suchen,
kann man die Funktionen
index und rindex benutzen. Der Unterschied dieser beiden Funktion ist, dass
rindex von hinten anfängt zu suchen und index eben von
vorne. Die Funktion liefert uns als Rückgabewert die Position, wo der Suchstring enthalten ist oder falls nicht gefunden
-1 ...
#!/usr/bin/perl -w
$suchstring=0;
$string=<<HERE_TEXT;
Um in einem Text nach einem bestimmten String- oder Stringfolge
zu suchen gibt es die Funktionen index und rindex.
Der Unterschied dieser beiden Funktion ist das rindex
von hinten anfängt zu suchen und index eben von vorne.
Diese Funktion kann für C-Programmierer mit strstr verglichen werden.
Die Funktion liefert uns als Rückgabewert die Position wo der
Suchstring enthalten ist ...
HERE_TEXT
print "Nach welchen Wort- oder Wortfolge wollen Sie suchen : ";
chomp($suchstring=<STDIN>);
print "Das Wort wurde gefunden an Position " . index($string, $suchstring) . "\n";
print q%"-1" steht für nicht gefunden% . "\n";
Die Funktion chomp haben Sie ja bereits bei der Eingabe kennen gelernt. Diese Entfernt das letzte Zeichen nur, wenn es mit dem Wert der Internen Variable
$\ übereinstimmt (Voreinstellung ist das Zeichen \n).
Zusätzlich gibt es noch die Funktion chop, die genauso verwendet wird wie chomp, nur das diese Funktion
immer das letzte Zeichen entfernt!
Das waren jetzt nicht alle String-Funktionen. Mehr werden Sie im Verlaufe dieses Kurses
kennen lernen.
Anhand dieses Kapitels, werden Sie jetzt wohl gemerkt haben, was so besonderes an Perl ist. Die Einfachheit und Flexibilität Programme zu schreiben
bietet wohl kaum eine Sprache so wie Perl. Natürlich ist der Nachteil auch,
dass es in Perl auch so einfach ist, einen Code zu schreiben der nicht mehr zum Verstehen ist.
Mit der Funktion substr können Sie auf Teile eines Strings
zugreifen. Hier der Syntax dazu ...
$string = substr(STRING, Offset[,len]);
Damit wird der STRING ab der Position Offset an die Variable $string
übergeben. len ist Optional und bedeutet, falls es verwendet wird : STRING wird ab der Position Offset bis len
verwendet. Genug der Theorie. Hier ein paar Beispiele ...
#!/usr/bin/perl -w
$string1 = "Perl ist toll";
$string2 = "Perl macht Spass";
print substr($string1, 9) , " "; #toll
print substr($string1,5,3) , " "; #ist
print substr($string1, -13, 4), "\n"; #Perl
print $string2 , " und " , substr($string1, 5) , "\n";
#Perl macht Spass und ist toll
substr($string1, 9, 9) = "Supertoll";
#ersetzt toll durch Supertoll
print $string1 , "\n";
An diesem Beispiel können Sie sehen, dass es auch Möglich ist, das Offset negativ anzugeben. Somit wird ab der letzten Position rückwärts gezählt.
Die Funktionen pack und unpack sind richtig eingesetzt, mächtige Waffen um Daten in ein bestimmtes String-Format zu packen (pack) und wieder zu entpacken (unpack).
Beginnen werden Sie mit unpack. Damit können Sie Daten, die uns im String-Format vorliegen,
in einzelnen Teile entpacken. Beispielsweise Sie wollen eine einfache Loggin-File Auswerten, die in folgender Form
vorliegt ...
01.08.2001 20.00Uhr Mark Mustermann 01.08.2001 23.34Uhr
02.08.2001 09.30Uhr Mark Mustermann 02.08.2001 11.23Uhr
...
Um dies jetzt in einzelne Strings zu zerlegen, könnten man mehrere substr()-Aufrufe betätigen. Aber wozu diese Mühe wenn es die Funktion unpack() gibt. Hier unser Skript, mit der Funktion unpack ...
#!/usr/bin/perl -w
$line_to_unpack = "01.08.2001 20.00Uhr Mark Mustermann 01.08.2001 23.34Uhr";
@output = qw(Login um User Logout um);
$counter=0;
@entpackt = unpack("a11 a9 a16 a11 a8", $line_to_unpack);
#("01.08.2001"," 20.00Uhr","Mark Mustermann"," 01.08.2001"," 23.34Uhr");
foreach (@entpackt){
print $output[$counter++] , "\t: ";
print $_ , "\n";
}
Nun die Erklärung zu ...
a11 a9 a16 a11 a8
Dies nennt sich Template-String und bedeutet, dass wir mit a11 einen Template-String anfordern, der 11 Zeichen breit ist. Sind
Sie aber z.B. nicht an das Logout mit Uhrzeit interessiert können Sie dies dem
Template-Zeichen x angeben. In unserem Beispiel würde dies dann so aussehen ...
@entpackt = unpack("a11 a9 a16 x11 x8", $line_to_unpack);
Somit werden die beiden letzten Daten ignoriert und auch nicht ausgegeben. Bei dem letzten Template-String, der Uhrzeit des Ausloggen, können
Sie auch anstatt ...
a8 -> a*
... verwenden. Das bedeutet praktisch ein Feld beliebiger Größe. In unserem Fall, da
dies am Schluss steht ist es eben der Rest.
Jetzt haben Sie gesehen wie es möglich ist, Strings auseinander zu nehmen mittels unpack. Mit
pack können wir einzelnen Strings wieder zu einem Ganzen fügen. Dies
können Sie wieder anhand unseres Beispiels sehen ...
#!/usr/bin/perl -w
@line_to_pack = ("01.08.2001","20.00Uhr","Mark Mustermann","01.08.2001","23.34Uhr");
$template = "A11 A9 A16 A11 A*";
$gepackt = pack($template, @line_to_pack);
print $gepackt , "\n";
Das Beispiel dürfte nicht allzu schwer zu verstehen sein. Warum aber wird
hier hier ein großes A verwendet, um den Template-String anzufordern. Damit werden Beispielsweise bei A11 die restlichen Zeichen von "01.08.2001" mit Leerzeichen gefüllt werden. Ein kleines a ignoriert die Leerzeichen.
Perl bietet eine Menge mehr sehr nützlicher Template zum packen und entpacken. Hierzu nun einige
Template-Zeichen und Ihre Bedeutung ...
| Template-Zeichen |
Bedeutung |
| a |
ASCII-String |
| A |
ASCII-String |
| b |
Bit-String (niedrigstes Bit zuerst) |
| B |
Bit-String (höchstes Bit zuerst) |
| c |
Ein Zeichen mit Vorzeichen |
| C |
Ein Zeichen ohne Vorzeichen |
| d |
Fließkommawert |
| f |
Fließkommawert |
| h |
Hexdezimaler String (niedrigste Ziffer zuerst) |
| H |
Hexdezimaler String (höchste Ziffer zuerst) |
| i |
ganze Zahl mit Vorzeichen |
| I |
ganze Zahl ohne Vorzeichen |
| l |
langes Wort mit Vorzeichen |
| L |
langes Wort ohne Vorzeichen |
| n |
kurze Ganzzahl in Netzwerkanordnung |
| N |
lange Ganzzahl in Netzwerkanordnung |
| p |
Zeiger auf String |
| s |
kurze Ganzzahl mit Vorzeichen |
| S |
kurze Ganzzahl ohne Vorzeichen |
| u |
Decodieren eines Strings |
| x |
Überspringe ein Byte von vorne |
| X |
Überspringe ein Byte von hinten |
| @ |
Gehe zu angegeben Position in einem String |
|