<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<link rel="SHORTCUT ICON" href="../bilder//pl.ico">
<title>Mehr zur Zeichensuche </title>
</head>
<body bgcolor="#ffffff">
<hr>
<h1 align="center">Mehr zur Zeichensuche</h1>
<table align="center"><tr>
<td><a href="perl_reg.html"> <img src="../bilder//perl_links.gif" alt="[ vorherige Seite ]" width="43" height="30" border="0"></a></td>
<td><a href="../perl-tutorial.html"> <img src="../bilder//perl_titel.gif" alt="[ Titelseite ]" width="81" height="22" border="0"></a></td>
<td><a href="perl_inhalt.html"> <img src="../bilder//perl_inhalt.gif" alt="[ Inhalt ]" width="57" height="22" border="0"></a></td>
<td><a href="perl_index.html"> <img src="../bilder//perl_index.gif" alt="[ Index ]" width="54" height="22" border="0"></a></td>
<td><a href="perl_sub.html"> <img src="../bilder//perl_rechts.gif" alt="[ nächste Seite ]" width="43" height="30" border="0"></a></td>
</tr></table>
<hr>
<ul>
<li><a href="#abs1">Optionen beim Suchoperator</a></li>
<li><a href="#abs2">Optionen innerhalb eines regulären Ausdrucks</a></li>
<li><a href="#abs3">Spezielle Variablen</a></li>
<li><a href="#abs4">Suchen und Ersetzen</a></li>
</ul>
<a name="abs1"></a><hr>
<h2 align="center">Optionen beim Suchoperator</h2>
<hr>
<p>
Das Verhalten bei der Suche kann durch nachgestellte Optionen beeinflußt
werden:
</p>
<ul>
<li>
<code>g</code> ("<i>global</i>") <p>
Während standardmäßig die Suche beim ersten Treffer
abgebrochen wird, veranlaßt diese Option die Ausgabe einer
Liste von Lösungen, so als würde man die Stelle nach einem
gefundenen Substring als Startpunkt für eine erneute Suche
verwenden.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "123-456-789";<br><br>my @a = ($t =~ /[1-9]{3}/<font color="#0000cc">g</font>); <font color="#006600"># Suche nach Zifferntripel</font><br>foreach my $x (@a) { print "$x " }<br>print "\n";<br><br>foreach my $x ($t =~ /[1-9]{3}/<font color="#0000cc">g</font>) { print "$x " }<br>print "\n";<br><br>while($t =~ /[1-9]{3}/<font color="#0000cc">g</font>) { print "$& " }<br>print "\n";<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>123 456 789 <br>123 456 789 <br>123 456 789 <br></code></td></tr></table>
</td></tr></table>
<p>
Der erste Teil zeigt, wie die Suchoperation eine Liste aller
gefundenen Substrings zurückgibt. Anstelle der Zuweisung zu
einem Array kann auch <code>foreach</code> direkt die Lösungsliste
durchlaufen. Sehr häufig verwendet man auch die dritte dargestellte
Methode: schrittweises Durchsuchen der Zeichenkette mittels einer
<code>while</code>-Schleife.
</p>
<p>
Es ist zu beachten, daß die Suche nach einer weiteren Lösung
jeweils hinter dem zuvor gefundenen Muster beginnt. Daher gibt folgendes
Skript nur die eine Lösung "<code>-ab-</code>" aus (und
nicht noch "<code>-cd-</code>" zusätzlich).
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "-ab-cd-";<br><br>foreach($t =~ /-[a-z][a-z]-/<font color="#0000cc">g</font>) { print "$_ " }<br></code></td></tr></table>
</td></tr></table>
</li>
<li>
<code>i</code> ("<i>case-insensitive</i>") <p>
Verwendet man diese Option, wird bei der Suche nach Buchstaben nicht
zwischen Groß- und Kleinschreibung unterschieden (dies funktioniert
auch bei nationalen Sonderzeichen wie den deutschen Umlauten sofern das
Betriebssystem die entsprechende Sprachumgebung unterstützt).
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "Ähnlichkeit";<br><br>if($t =~ /ähn/) { print "wahr\n" }<br> else { print "falsch\n" }<br>if($t =~ /ähn/<font color="#0000cc">i</font>) { print "wahr\n" }<br> else { print "falsch\n" }<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>falsch<br>wahr<br></code></td></tr></table>
</td></tr></table>
</li>
<li>
<code>s</code> ("<i>single line</i>") <p>
Hiermit wird eine Zeichenkette als einzelne Zeile betrachtet, auch
wenn sie Zeilenvorschübe ("<code>\n</code>") enthält.
Dadurch entfällt dann in einem Suchmuster die Sonderrolle
von "<code>\n</code>" bezüglich des Punktes
("<code>.</code>"), der sonst nur auf alle anderen Zeichen,
nicht aber den Zeilenvorschub, paßt.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "AAA\nBBB\n";<br><br>if($t =~ /A.B/) { print "wahr\n" }<br> else { print "falsch\n" }<br>if($t =~ /A.B/<font color="#0000cc">s</font>) { print "wahr\n" }<br> else { print "falsch\n" }<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>falsch<br>wahr<br></code></td></tr></table>
</td></tr></table>
</li>
<li>
<code>m</code> ("<i>multiple lines</i>") <p>
Verwendet man diese Option, so passen die Ankerpunkte
"<code>^</code>" und "<code>$</code>" nicht nur am
Anfang bzw. Ende der vorgegebenen Zeichenkette,
sondern auch an jedem Zeilenanfang und -ende. Um einen Ankerpunkt an
den Anfang oder das Ende des untersuchten Strings zu setzen, muß
in diesem Falle "<code>\A</code>" bzw. "<code>\Z</code>"
verwendet werden.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "Kugel 1\nPyramide 2\nQuader 3\n";<br><br>my @a = ($t =~ /^\w+/g);<br>foreach (@a) { print "1) $_\n" }<br>@a = ($t =~ /^\w+/g<font color="#0000cc">m</font>);<br>foreach (@a) { print "2) $_\n" }<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>1) Kugel<br>2) Kugel<br>2) Pyramide<br>2) Quader<br></code></td></tr></table>
</td></tr></table>
</li>
<li>
<code>o</code> ("<i>compile once</i>") <p>
Diese Option dient der Optimierung der Mustersuche (hinsichtlich der
Geschwindigkeit) und sollte nur verwendet werden, wenn dies unbedingt
nötig ist. Ihre Wirkung besteht darin, daß eine
Variablenersetzung im Suchmuster nur einmal zu Beginn
stattfindet. Daher muß sichergestellt sein, daß sich
die entsprechenden
Variablen während der Suche nicht ändern.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "123..abc...456";<br><br>my $muster = '0-9';<br>while($t =~ /[$muster]+/g)<br>{<br> $muster = 'a-z'; <font color="#006600"># Zeichenklasse ändern</font><br> print "1) $&\n";<br>}<br><br>$muster = '0-9';<br>while($t =~ /[$muster]+/g<font color="#0000cc">o</font>)<br>{<br> $muster = 'a-z'; <font color="#006600"># hier wirkungslos</font><br> print "2) $&\n";<br>}<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>1) 123<br>1) abc<br>2) 123<br>2) 456<br></code></td></tr></table>
</td></tr></table>
<p>
Hier sieht man nebenbei, daß Suchmuster durchaus auch in Variablen
gespeichert werden können.
</p>
</li>
<li>
<code>x</code> ("<i>extended</i>") <p>
Um komplizierte reguläre Ausdrücke übersichtlicher
darstellen zu können, gibt es die Option "<code>x</code>",
die es ermöglicht, Ausdrücke auf mehrere Zeilen zu verteilen
und (normale) Perl-Kommentare einzufügen.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = '...<IMG SRC="pfad/bild.gif" WIDTH=110>...';<br><br>$t =~ /<IMG <font color="#006600"># HTML-Tag für Bild (Beginn)</font><br> \s+ <font color="#006600"># Leerzeichen</font><br> SRC=" <font color="#006600"># Hier kommt der URL</font><br> (.+?) <font color="#006600"># Diesen Pfad suchen wir</font><br> " <font color="#006600"># Ende des URL</font><br> .*? <font color="#006600"># vielleicht noch Optionen</font><br> > <font color="#006600"># Ende des HTML-Tags</font><br> /i<font color="#0000cc">x</font>; <font color="#006600"># case-insensitive, extended</font><br><br>print "$1\n";<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>pfad/bild.gif<br></code></td></tr></table>
</td></tr></table>
</li>
</ul>
<p align="right"><a href="perl_suche2.html">[Seitenanfang]</a></p>
<a name="abs2"></a><hr>
<h2 align="center">Optionen innerhalb eines regulären Ausdrucks</h2>
<hr>
<p>
Die im vorherigen Abschnitt beschriebenen global wirkenden Optionen
können auch innerhalb eines regulären Ausdrucks gesetzt
werden, um beispielsweise nur Teile davon zu beeinflussen.
Dies wird durch
"<code>(?</code><i>Option(en)</i><code>)</code>" bewerkstelligt.
Hierbei können die Optionen <code>i</code>, <code>m</code>,
<code>s</code> und <code>x</code> verwendet werden. Die Wirkung
erstreckt sich bis zum Ende des regulären Ausdrucks, innerhalb einer
Gruppierung oder bis zu einer Deaktivierung mittels
"<code>(?-</code><i>Option(en)</i><code>)</code>".
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "ABcd";<br><br>$t =~ /[a-z][a-z]/<font color="#0000cc">i</font>; print "$&\n"; <font color="#006600"># 1</font><br>$t =~ /<font color="#0000cc">(?i)</font>[a-z][a-z]/; print "$&\n"; <font color="#006600"># 2</font><br>$t =~ /(<font color="#0000cc">(?i)</font>[a-z])[a-z]/; print "$&\n"; <font color="#006600"># 3</font><br>$t =~ /[a-z]<font color="#0000cc">(?i)</font>[a-z]/; print "$&\n"; <font color="#006600"># 4</font><br>$t =~ /<font color="#0000cc">(?i)</font>[a-z]<font color="#0000cc">(?-i)</font>[a-z]/; print "$&\n"; <font color="#006600"># 5</font><br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>AB<br>AB<br>Bc<br>cd<br>Bc<br></code></td></tr></table>
</td></tr></table>
<p>
Test 2 ist äquivalent zu Test 1. In Test 3 ist wegen der
Klammerung nur für den ersten Buchstaben Großschrift erlaubt.
Da in Test 4 der erste Buchstabe klein geschrieben sein muß,
kommt nur "<code>cd</code>" als Lösung infrage. Die letzte
Zeile zeigt wie man eine Option wieder abschalten kann (entspricht
Test 3).
</p>
<p align="right"><a href="perl_suche2.html">[Seitenanfang]</a></p>
<a name="abs3"></a><hr>
<h2 align="center">Spezielle Variablen</h2>
<hr>
<p>
In den vorherigen Abschnitten wurden schon einige spezielle Perl-Variablen
im Zusammenhang mit der Mustersuche erwähnt; hier eine Übersicht:
</p>
<ul>
<li>
<code>$&</code> gibt das gefundene Muster zurück </li>
<li>
<code>$1,$2,$3,...</code> enthält das Muster der 1.,2.,3.,...
runden Klammer </li>
<li>
<code>$+</code> enthält das Muster der letzten runden Klammer </li>
<li>
<code>$`</code> enthält die Zeichenkette, die vor dem gefundenen
Muster steht </li>
<li>
<code>$'</code> enthält die Zeichenkette, die hinter dem gefundenen
Muster steht </li>
</ul>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $s = "Dies ist ein Test ...";<br><br>if($s =~ /is<font color="#0000cc">(</font>[a-z]<font color="#0000cc">)</font> <font color="#0000cc">(</font>.*<font color="#0000cc">)</font> Test/) {<br> print <font color="#0000cc">$&</font>."\n";<br> print <font color="#0000cc">$1</font>."\n";<br> print <font color="#0000cc">$2</font>."\n";<br> print <font color="#0000cc">$+</font>."\n";<br> print <font color="#0000cc">$`</font>."\n";<br> print <font color="#0000cc">$'</font>."\n";<br>}<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>ist ein Test<br>t<br>ein<br>ein<br>Dies <br> ...<br></code></td></tr></table>
</td></tr></table>
<p align="right"><a href="perl_suche2.html">[Seitenanfang]</a></p>
<a name="abs4"></a><hr>
<h2 align="center">Suchen und Ersetzen</h2>
<hr>
<p>
Anstelle einer einfachen Suche kann man in Perl auch den gefundenen
Ausdruck direkt durch einen neuen ersetzen.
Allgemein:
</p>
<blockquote>
<code>$string =~ s/</code><i>Regexp</i><code>/</code><i>Ersatz</i><code>/</code><i>Optionen</i><code>;</code>
</blockquote>
<p>
Dabei wird wie beim Suchoperator ("<code>m/.../</code>")
<code>$string</code> nach
einer zu <i>Regexp</i> passenden Zeichenkette durchsucht. Wird ein solcher
Teilstring gefunden, so wird an dessen Stelle der Text <i>Ersatz</i> gesetzt.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "Beispiel";<br><font color="#0000cc">$t =~ s/e/-e-/;</font><br>print "$t\n";<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>B-e-ispiel<br></code></td></tr></table>
</td></tr></table>
<p>
Im obigen Beispiel wird der String <code>$t</code> nach dem Buchstaben
"<code>e</code>" abgesucht und (beim ersten Auffinden) durch die
Zeichenkette "<code>-e-</code>" ersetzt.
</p>
<p>
Auch beim Suchen und Ersetzen können die Schrägstriche des Operators
durch andere Zeichen ersetzt werden (keine alphanumerischen Symbole oder
Leerzeichen).
</p>
<p>
Es können die gleichen Optionen wie beim Suchoperator verwendet werden,
ihre Wirkung bezieht sich dabei auf den regulären Ausdruck.
Eine zusätzliche Option ermöglicht die Auswertung
des <i>Ersatz</i>-Teils.
</p>
<p>
Optionen:
</p>
<ul>
<li>
<code>g</code> ("<i>global</i>") <p>
(siehe <a href="#abs1">Optionen beim Suchoperator</a>)
</p>
</li>
<li>
<code>i</code> ("<i>case-insensitive</i>") <p>
(siehe <a href="#abs1">Optionen beim Suchoperator</a>)
</p>
</li>
<li>
<code>s</code> ("<i>single line</i>") <p>
(siehe <a href="#abs1">Optionen beim Suchoperator</a>)
</p>
</li>
<li>
<code>m</code> ("<i>multiple lines</i>") <p>
(siehe <a href="#abs1">Optionen beim Suchoperator</a>)
</p>
</li>
<li>
<code>o</code> ("<i>compile once</i>") <p>
(siehe <a href="#abs1">Optionen beim Suchoperator</a>)
</p>
</li>
<li>
<code>x</code> ("<i>extended</i>") <p>
(siehe <a href="#abs1">Optionen beim Suchoperator</a>)
</p>
</li>
<li>
<code>e</code> ("<i>evaluate</i>") <p>
Diese Option bewirkt, daß beim Ersetzen der einzusetzende
Ausdruck wie
ein Befehl in Perl behandelt und ausgewertet wird. Dies kann sogar mehrfach
geschehen.
</p>
<p>
Beispiel:
</p>
<table align="center" bgcolor="#ffcc99" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ffffcc" border="0" cellpadding="10" width="100%">
<tr><td><code>#!/usr/local/bin/perl -w<br><br>use strict;<br><br>my $t = "5+7";<br><br>$t =~ s|^(\d+)\+(\d+)$|$1+$2|<font color="#0000cc">e</font>; <font color="#006600"># hier '|' statt '/'</font><br>print "$t\n\n";<br><br>$t = '_x_';<br><br>(my $s = $t) =~ s/x+/'"m" x 3' x 1/;<br>print "$s\n";<br><br>($s = $t) =~ s/x+/'"m" x 3' x 1/<font color="#0000cc">e</font>;<br>print "$s\n";<br><br>($s = $t) =~ s/x+/'"m" x 3' x 1/<font color="#0000cc">ee</font>;<br>print "$s\n";<br></code></td></tr></table>
</td></tr></table>
<table align="center" bgcolor="#66cc66" border="0" cellpadding="2" width="80%"><tr><td>
<table bgcolor="#ccffcc" border="0" cellpadding="5" width="100%">
<tr><td><code>12<br><br>_'"m" x 3' x 1_<br>_"m" x 3_<br>_mmm_<br></code></td></tr></table>
</td></tr></table>
</li>
</ul>
<p align="right"><a href="perl_suche2.html">[Seitenanfang]</a></p>
<hr>
<table align="center"><tr>
<td><a href="perl_reg.html"> <img src="../bilder//perl_links.gif" alt="[ vorherige Seite ]" width="43" height="30" border="0"></a></td>
<td><a href="../perl-tutorial.html"> <img src="../bilder//perl_titel.gif" alt="[ Titelseite ]" width="81" height="22" border="0"></a></td>
<td><a href="perl_inhalt.html"> <img src="../bilder//perl_inhalt.gif" alt="[ Inhalt ]" width="57" height="22" border="0"></a></td>
<td><a href="perl_index.html"> <img src="../bilder//perl_index.gif" alt="[ Index ]" width="54" height="22" border="0"></a></td>
<td><a href="perl_sub.html"> <img src="../bilder//perl_rechts.gif" alt="[ nächste Seite ]" width="43" height="30" border="0"></a></td>
</tr></table>
<hr>
<table width="100%"><tr>
<td align="left"><i>Autor:
<a href="mailto:Eike.Grote@web.de">Eike Grote</a></i>
</td>
<td align="right"><i>Version: 2.05 (24.1.2012)</i>
</td>
</tr></table>
</body>
</html>