# Suchoperatoren

- Ersetzen einzelner Zeichen
- Suchoperator

## Ersetzen einzelner Zeichen

Will man bestimmte Symbole durch andere ersetzen (i.a. tritt anstelle eines Zeichens genau ein anderes), so verwendet man den Operator

> `$string =~ tr/`Suchliste`/`Ersetzungsliste`/`Optionen`;`

Dabei sind Such- und Ersetzungsliste jeweils Listen aus Symbolen. Beim Ersetzen wird wie folgt vorgegangen: tritt in `$string` das erste Zeichen der Suchliste auf, so wird dieses Zeichen entfernt und an die Stelle wird das erste Zeichen der Ersetzungsliste gesetzt. Analog wird jedes Auftreten des zweiten Zeichens der Suchliste durch das zweite Zeichen der Ersetzungliste ersetzt usw.

Beispiel:

`#!/usr/local/bin/perl -w use strict; my $s = "--abcd--cde--"; print "$s\n"; $s =~ tr/abc/ABC/; print "$s\n";`

`--abcd--cde-- --ABCd--Cde--`

Zur Vereinfachung können mittels eines Minuszeichens "`-`" auch Zeichenbereiche angegeben werden (z.B. "alle Kleinbuchstaben" durch "`a-z`"). Die Reihenfolge der Zeichen ist dabei durch den Zeichensatz bestimmt, man sollte sich hier auf Buchstaben und Ziffern beschränken. Will man ein Minus ersetzen, so muß es wegen dieser Sonderbedeutung an Anfang oder Ende von Such- bzw. Ersetzungliste stehen.

Tritt ein Zeichen mehrmals in der Suchliste auf, so wird es durch dasjenige Symbol der Ersetzungliste ersetzt, das als erstes als Partner auftritt. Ist die Suchliste länger als die Ersetzungsliste, so wird das letzte Zeichen der Ersetzungsliste so oft wiederholt, bis beide Listen gleich lang sind (die überzähligen Symbole der Suchliste werden also alle dem letzten Zeichen der Ersetzungsliste zugeordnet). Ist die Ersetzungsliste leer, so wird der Inhalt der Suchliste dort eingetragen (dadurch finden zwar keine ersichtlichen Ersetzungen statt, aber der Operator kann dann zum Zählen von Zeichen verwendet werden, da der Rückgabewert die Anzahl der ersetzten Zeichen ist).

`#!/usr/local/bin/perl -w use strict; my $s = "--abcd--cde--"; print "$s\n\n"; (my $t = $s) =~ tr/a-c/A-C/; # entspricht 'tr/abc/ABC/' print "$t\n"; ($t = $s) =~ tr/ccc/123/; # entspricht 'tr/c/1/' print "$t\n"; ($t = $s) =~ tr/-b/+-/; print "$t\n"; ($t = $s) =~ tr/abcde/xy/; # entspricht 'tr/abcde/xyyyy/' print "$t\n"; my $z = ($t = $s) =~ tr/-//; # entspricht 'tr/-/-/' print "$t ($z Minuszeichen in $s)\n";`

`--abcd--cde-- --ABCd--Cde-- --ab1d--1de-- ++a-cd++cde++ --xyyy--yyy-- --abcd--cde-- (6 Minuszeichen in --abcd--cde--)`

Anmerkung zur Zuweisung: Im obigen Beispiel wird jeweils der Variablen `$t` zunächst der Inhalt von `$s` zugewiesen, anschließend erfolgt dann die Ersetzung (nur in `$t`!). Die vorletzte Zeile zeigt noch, wie man den Rückgabewert der Ersetzungsoperation erhält.

Optionen:

- `c` ("complement")

  Diese Option bedeutet für die Suchliste soviel wie "alle Zeichen außer...".

  Beispiel:

  `#!/usr/local/bin/perl -w use strict; my $s = "abcd?%(1)---23ABCDEF4 xxx5\n"; print "$s\n"; $s =~ tr/0-9/./c; print "$s\n";`

  `abcd?%(1)---23ABCDEF4 xxx5 .......1....23......4....5.`

  Hier werden alle Zeichen, die keine Ziffern sind, durch Punkte ersetzt.

- `s` ("squash down")

  Werden aufeinander folgende Zeichen durch das gleiche Symbol ersetzt, so wird bei Verwendung dieser Option dieses Symbol nur einmal gesetzt.

  Erweiterung des obigen Beispiels:

  `#!/usr/local/bin/perl -w use strict; my $s = "abcd?%(1)---23ABCDEF4 xxx5\n"; print "$s\n"; $s =~ tr/0-9/./cs; print "$s\n";`

  `abcd?%(1)---23ABCDEF4 xxx5 .1.23.4.5.`

- `d` ("delete")

  Diese Option verhindert die Verlängerung der Ersetzungsliste, falls die Suchliste kürzer ist. Dies bewirkt, daß die überzähligen Zeichen der Suchliste gelöscht werden.

  Beispiel:

  `#!/usr/local/bin/perl -w use strict; my $s = "--abcd--cde--"; print "$s\n\n"; my $t; ($t = $s) =~ tr/abcde/xy/; # entspricht 'tr/abcde/xyyyy/' print "$t\n"; ($t = $s) =~ tr/abcde/xy/d; print "$t\n";`

  `--abcd--cde-- --xyyy--yyy-- --xy----`

Anstelle der Schrägstriche können im Ersetzungsoperator auch andere Zeichen gesetzt werden, wobei Klammern gesondert behandelt werden. Außerdem kann (in Anlehnung an den Ersetzungsoperator in sed) anstelle von "`tr`" auch "`y`" stehen.

[Seitenanfang]

## Suchoperator

Eine der besonderen Stärken von Perl liegt in der Verwendung sogenannter "regulärer Ausdrücke" (regular expressions). Mit deren Hilfe lassen sich beispielsweise Zeichenketten nach bestimmten Teilstrings durchsuchen, wobei der reguläre Ausdruck wie eine Art Schablone wirkt und die Stelle gesucht wird, wo dieses Muster zum ersten Male paßt.

Der einfache Suchoperator, der reguläre Ausdrücke verwendet, sieht allgemein so aus:

> `$string =~ m/`Regexp`/`Optionen`;`

Hier wird die Zeichenkette in `$string` danach durchsucht, ob sich der reguläre Ausdruck "Regexp" an irgendeiner Stelle darin anwenden läßt. Der Rückgabewert ist "wahr" (true), falls dies zutrifft, sonst "falsch" (false). Verwendet man anstelle von "`=~`" den Operator "`!~`", so ist der Rückgabewert genau entgegengesetzt: wahr bei erfolgloser Suche.

Diejenige Zeichenkette, die auf das Suchmuster paßt, wird - sofern die Suche erfolgreich verläuft - in der speziellen Variablen "`$&`" gespeichert.

Statt der Schrägstriche ("`/.../`") können auch einige andere Zeichen benutzt werden, sofern es sich dabei nicht um alphanumerische Symbole (Buchstaben, Ziffern, Unterstrich) oder Leerzeichen (space, newline, tab,...) handelt; verwendet man Schrägstriche, kann das "`m`" am Anfang weggelassen werden.

Erläuterungen, was reguläre Ausdrücke sind und wie sie verwendet werden, finden sich in den nachfolgenden Abschnitten.

[Seitenanfang]

Autor: Eike Grote | Version: 2.02 (30.5.2005)