Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Linux, SystemprogrammierungPerl Kurs Skripting Strings substr pack unpack Template Zeichen Substring Zeichenkette Konkatenation Strings substr pack unpack Zeichen Substring Zeichenkette Konkatenation Perl Kurs Kapitel 4

4.1. Stringoperationen           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

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.

4.2. Stringfunktionen           zurück Ein Kapitel tiefer Ein Kapitel höher zum Inhaltsverzeichnis

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.

4.3. Zugriff auf Substrings           zurück Ein Kapitel tiefer Ein Kapitel höher zum Inhaltsverzeichnis

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.

4.4. Strings packen und entpacken           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

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
ASCII-String
A ASCII-String
b  Bit-String (niedrigstes Bit zuerst)
B Bit-String (höchstes Bit zuerst)
c  Ein Zeichen mit Vorzeichen
Ein Zeichen ohne Vorzeichen
Fließkommawert
Fließkommawert
Hexdezimaler String (niedrigste Ziffer zuerst)
Hexdezimaler String (höchste Ziffer zuerst)
ganze Zahl mit Vorzeichen
ganze Zahl ohne Vorzeichen
langes Wort mit Vorzeichen
langes Wort ohne Vorzeichen
kurze Ganzzahl in Netzwerkanordnung
lange Ganzzahl in Netzwerkanordnung
Zeiger auf String
kurze Ganzzahl mit Vorzeichen
kurze Ganzzahl ohne Vorzeichen
Decodieren eines Strings
Überspringe ein Byte von vorne
Überspringe ein Byte von hinten
Gehe zu angegeben Position in einem String