SELFHTML: Perl / Perl-Sprachelemente / Zeichenketten (Strings)
Author: Redaktion SELFHTML, selfhtml81@selfhtml.org
Description: Welche Besonderheiten es bei Zeichenketten in Perl zu beachten gibt.
Keywords: SELFHTML, Perl, Zeichenketten, Strings, Steuerzeichen, Interpolation, Maskierung
Date: 2005-11-09T00:29:27+01:00

| # Zeichenketten (Strings)
| Eigenschaften von Zeichenketten Regeln beim Notieren von Zeichenketten Steuerzeichen in Zeichenketten Maskierung von Zeichen in Zeichenketten Funktionszeichen in Zeichenketten Numerische Notation von Zeichen in Zeichenketten Operationen und Funktionen für Zeichenketten

## Eigenschaften von Zeichenketten

Zeichenketten sind in Perl, anders als etwa in C, keine Arrays aus Zeichen, sondern ein einziges "Datum". Jede Zeichenkette ist potentiell unendlich groß und nur durch den verfügbaren Speicher in ihrer Größe begrenzt. Es ist also kein Problem, auch größere Datenmengen in einer Zeichenkette zu speichern.

Eine wichtige Eigenschaft von Zeichenketten in Perl ist auch, dass sie beliebige Zeichen enthalten können. Es gibt also keine reservierten Zeichen wie in C etwa das Zeichen mit dem Wert `0` zum Anzeigen des Endes der Zeichenkette. Auch andere Steuerzeichen, die andernorts als typische Endekennzeichen verwendet werden, etwa das Steuerzeichen für Zeilenumbruch, können innerhalb von Zeichenketten in Perl beliebig vorkommen. Zeichenketten in Perl können deshalb auch problemlos binäre Daten aufnehmen und verarbeiten.

Als Variablentyp zum Speichern einer einzelnen Zeichenkette sind Skalare vorgesehen.

## Regeln beim Notieren von Zeichenketten

Beim direkten Notieren von Zeichenketten können Sie die Zeichenkette wahlweise in einfache oder doppelte Anführungszeichen setzen oder die `q`- bzw. `qq`-Operatoren dazu nutzen. Für mehrzeilige Zeichenketten bieten sich die so genannten "Hier-Dokumente" an. Es gibt einige semantische Unterschiede zwischen den Notationen:

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print <<'KOPF';
    Content-type: text/html

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html><head><title>Testausgabe</title>
    </head><body>
    KOPF

    my $Name = "Methusalem";
    my $Alter = 625;

    print "$Name ist ein alter Mann, sehr alt. Er ist $Alter Jahre alt<br>\n";
    print '$Name ist ein alter Mann, sehr alt. Er ist $Alter Jahre alt<br>\n';

    print qq($Name ist ein alter Mann, sehr alt. Er ist $Alter Jahre alt<br>\n);
    print q($Name ist ein alter Mann, sehr alt. Er ist $Alter Jahre alt\n);

    print "</body></html>\n";

### Erläuterung:

Im Beispiel werden der HTTP-Header sowie die ersten HTML-Zeilen mit Hilfe eines so genannten "Hier-Dokuments" ausgegeben. Hier-Dokumente haben etwa die gleiche Wirkung wie das `pre`-Element in HTML. Die Zeichenkette wird dabei so formatiert wie sie im Quelltext notiert ist. Ein Hier-Dokument beginnt mit dem einleitenden `<<` und dem Namen eines Endbegrenzers (im Beispiel: `KOPF`). Der Name kann in einfache oder doppelte Anführungszeichen eingeschlossen werden, welche den gleichen Effekt haben wie bei "normalen" Zeichenketten auch. Bei doppelten Anführungszeichen werden Variablen innerhalb des Hier-Dokuments interpoliert, bei einfachen nicht. Wenn Sie die Anführungszeichen ganz weglassen, nimmt Perl doppelte Anführungszeichen an. Zwischen dem `<<` und dem Namen darf kein Leerzeichen stehen. Beendet wird das Hier-Dokument durch den Endbegrenzer (ohne Anführungszeichen), der allein in einer Zeile ohne Leerzeichen davor oder dahinter stehen muss. Die Zeile muss unbedingt mit einem Zeilenumbruch abgeschlossen werden.

Im obigen Beispiel werden anschließend zwei Skalare `$Name` und `$Alter` deklariert und mit einem Anfangswert versehen. Dann wird mit `print`-Anweisungen mehrmals die gleiche Zeichenkette ausgegeben - zunächst einmal in doppelten Anführungszeichen, dann in einfachen Anführungszeichen. Beide Male enthält die Zeichenkette im Satz eingebettet die Skalare `$Name` und `$Alter`. Bei der Ausgabe wird sichtbar, dass bei Verwendung doppelter Anführungszeichen die Skalare `$Name` und `$Alter` durch ihren gespeicherten Wert ersetzt werden (Fachjargon: Interpolation), während bei Verwendung einfacher Anführungszeichen an den entsprechenden Stellen einfach die Zeichenfolgen `$Name` und `$Alter` ausgegeben werden. Ferner wird bei der Version mit den einfachen Anführungszeichen das abschließend notierte Steuerzeichen `\n` ebenfalls so ausgegeben wie es als Zeichenfolge da steht, während das Steuerzeichen bei Verwendung doppelter Anführungszeichen interpretiert wird, also im ausgegebenen Text tatsächlich einen Zeilenumbruch erzeugt.

Das bedeutet also: verwenden Sie doppelte Anführungszeichen, wenn in einer Zeichenkette angegebene Variablen und Steuerzeichen interpretiert werden sollen, und verwenden Sie einfache Anführungszeichen, wenn genau das nicht geschehen soll.

Die beiden Operatoren `qq` und `q` entsprechen den doppelten bzw. einfachen Anführungszeichen. Bei `qq` werden Variablen und Steuerzeichen interpretiert, bei `q` dagegen nicht. Die Verwendung von `qq` und `q` ist nicht so gebräuchlich wie diejenige mit Anführungszeichen, doch sie kann Quelltext durchaus lesbarer machen. Im obigen Beispiel wurden runde Klammern gewählt, um den Inhalt von `qq` und `q` einzuschließen. Sie können jedoch auch andere Zeichen dazu verwenden. Bei Zeichen, die ein Gegenstück besitzen, etwa `<` und `>`, `{` und `}` oder `[` und `]`, wird dieses als Endbegrenzer erwartet. Perl achtet dann auf Verschachtelungen innerhalb der Zeichenkette. Derartige Klammern eignen sich somit hervorragend dafür, um beispielsweise Perl-Code innerhalb einer Zeichenkette darzustellen. Wenn Sie andere Zeichen als Begrenzer verwenden, achten Sie darauf, dass das Zeichen in der Zeichenkette nicht vorkommt.

Neben diesen Formen gibt es auch noch `qx` oder als Alternative dazu die so genannten Backticks. Damit erzeugen Sie Zeichenketten, die von Perl als Systemaufruf umgesetzt werden. Einzelheiten dazu im Abschnitt qx(...) - Andere Programme/Scripts ausführen und STDOUT auffangen.

## Steuerzeichen in Zeichenketten

Für die Notation einiger wichtiger Steuerzeichen stellt Perl eine spezielle Notationssyntax zur Verfügung, die sich an die Sprache C anlehnt. Solche Zeichen werden durch einen Backslash `\` eingeleitet. Dahinter folgt ein Buchstabe, der das Steuerzeichen bezeichnet. Diese Steuerzeichen werden nur innerhalb von Zeichenketten interpretiert, die in doppelten Anführungszeichen `"..."` oder in `qq(...)` stehen, und auch nur dann, wenn der Ausgabekanal entsprechende Möglichkeiten bietet. Folgende Steuerzeichen gibt es:

Notation | Bedeutung | Beispiel
--- | --- | ---
`\a` | Alarmton (Beep) | `print "\a"`
`\b` | Backspace-Zeichen | `print "meine\b"`
`\e` | Escape-Zeichen zur Einleitung von Escape-Sequenzen | `print "\e[A"`
`\f` | Steuerzeichen für Seitenvorschub | `print "Seitenende\fSeitenanfang"`
`\n` | Steuerzeichen für Zeilenvorschub. Der genaue Zeichencode dafür ist betriebssystemabhängig. Unter Unix ist es beispielsweise der ASCII-Code `10`, während es auf Apple-Macintosh der ASCII-Code `13` und unter DOS eine Zeichenfolge aus ASCII `13` und `10` ist. | `print "Zeilenende\nZeilenanfang"`
`\r` | Steuerzeichen für Wagenrücklauf. Der genaue Zeichencode dafür ist betriebssystemabhängig. Unter Unix und DOS ist es beispielsweise der ASCII-Code `13`, während es auf Apple-Macintosh der ASCII-Code `10` ist. | `print "Wagen\rWagenrücklauf"`
`\t` | Steuerzeichen für Tabulator | `print "Alter:\t32"`

## Maskierung von Zeichen in Zeichenketten

Jene Zeichen, die eine Zeichenkette einschließen, müssen Sie, falls das entsprechende Zeichen innerhalb der Zeichenkette vorkommt, maskieren. Dazu wird der Backslash `\` als Maskierungszeichen verwendet. Da nun dadurch auch der Backslash besondere Bedeutung erhält, muss er selber ebenfalls maskiert werden, falls er in einer Zeichenkette als Zeichen vorkommt.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/plain\n\n";

    print "Eine typische print-Ausgabe ist \"Hallo Welt\\n\";\n";
    print "Eine typische print-Ausgabe ist 'Hallo Welt\\n';\n";

    print 'Eine typische print-Ausgabe ist "Hallo Welt\n";',"\n";
    print 'Eine typische print-Ausgabe ist \'Hallo Welt\n\';';

### Erläuterung:

Das Beispiel sendet reinen Text und gibt dabei mit `print`-Anweisungen viermal den gleichen Satz aus. Bei den ersten beiden Anweisungen werden doppelte Anführungszeichen verwendet. Wie im Beispiel ersichtlich, muss dabei das Zeichen `"` durch `\"` maskiert werden. Ebenfalls maskiert werden muss der Backslash `\`, und zwar durch `\\`.
Die beiden unteren Anweisungen verwenden dagegen einfache Anführungszeichen. Dabei muss nur eben dieses Zeichen maskiert werden, wenn es vorkommt, und zwar durch `\'` - das ist in der letzten der Anweisungen der Fall.

## Funktionszeichen in Zeichenketten

Perl stellt bestimmte eigene Steuerzeichen zur Verfügung, die funktionale Auswirkungen auf nachfolgend notierte Zeichen haben. Solche Zeichen werden durch einen Backslash `\` eingeleitet. Dahinter folgt ein Buchstabe, der das Funktionszeichen bezeichnet. Diese Funktionszeichen werden nur innerhalb von Zeichenketten interpretiert, die in doppelten Anführungszeichen `"..."` oder in `qq(...)` stehen. Folgende Funktionszeichen gibt es:

Notation | Bedeutung | Beispiel
--- | --- | ---
`\U` | Großschreibung (upper case). Funktionsgleich mit uc. | `print "\UGroßes Geschrei"`
`\L` | Kleinschreibung (lower case). Funktionsgleich mit lc. | `print "\LCp Dat1.TXT Dat2.TXT"`
`\u` | Großschreibung des ersten Zeichens. Funktionsgleich mit ucfirst. | `print "\ugroß und klein"`
`\l` | Kleinschreibung des ersten Zeichens. Funktionsgleich mit lcfirst. | `print "\lGroß und klein"`
`\E` | Endezeichen für `\U` und `\L`. | `print "\UAlles groß? \ENein, nicht alles"`

## Numerische Notation von Zeichen in Zeichenketten

Sie können beliebige Zeichen einer Zeichenkette auch mit ihrem numerischen Zeichenwert notieren. Erlaubt sind allerdings nur oktale und hexadezimale Angaben.

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);

    print "Content-type: text/plain\n\n";

    print "\123\164\145\146\141\156 oktal\n";
    print "\x53\x74\x65\x66\x61\x6E hexadezimal\n";
    print "Stefan normal\n";

### Erläuterung:

Das Beispiel sendet reinen Text und gibt dabei mit `print`-Anweisungen dreimal das Wort `Stefan` und ein Zeilenumbruch-Zeichen aus. Bei der ersten Anweisung werden die Buchstaben des Namens in oktaler Schreibweise notiert, bei der zweiten Anweisung in hexadezimaler Schreibweise. Bei der oktalen Schreibweise beginnen so dargestellte Zeichen mit einem Backslash, gefolgt von der Zahl (erlaubt sind bei oktaler Schreibweise die Ziffern `0` bis `7`). Bei hexadezimaler Schreibweise beginnen Zeichen ebenfalls mit Backslash, gefolgt jedoch von einem `x` und dahinter der Zahl (erlaubt sind bei hexadezimaler Schreibweise die Ziffern `0` bis `9` und `A` bis `F`).

## Operationen und Funktionen für Zeichenketten

Eine der Stärken von Perl ist das Manipulieren von Zeichenketten. Perl stellt daher etliche Operationen und Funktionen zur Zeichenkettenbearbeitung bereit.

Zeichenketten aneinanderhängen:
Ein wichtiger Operator für Zeichenketten ist der Punkt-Operator, der es erlaubt, eine Zeichenkette an eine andere anzuhängen. Siehe dazu Operator für Zeichenkettenverknüpfung

Teile aus Zeichenketten extrahieren: Oft ist es wichtig, aus einer Zeichenkette einen ganz bestimmten Teil zu extrahieren, so etwa aus einem URI den reinen Domainnamen. Perl bietet dazu folgende Funktionen an: index und substr.

Suchen und Ersetzen in Zeichenketten:
Perl ermöglicht gezieltes Durchsuchen von Zeichenketten. Ebenfalls möglich ist Suchen und Ersetzen. Der Schlüssel dazu sind reguläre Ausdrücke.

Länge einer Zeichenkettenkette ermitteln:
Dazu gibt es in Perl die Funktion length.

Zeichenketten in mehrere aufsplitten:
Viele Zeichenketten enthalten so genannte Trennzeichen, etwa bei eingelesenen Zeilen einer kommaseparierten Datei. In solchen Fällen macht es Sinn, aus der Zeichenkette eine Liste mit Einzelwerten zu machen. Dazu gibt es die Funktion split.

| Zahlen
| Vordefinierte Variablen in Perl

© 2007 Impressum