regulärer Ausdruck
Dirk
- perl
Hallo zusammen,
ich habe ein Problem mit einem reg. Ausdruck, dessen Suchmuster in einer Variablen steht.
Code:
$m04 = "suchstring";
if($Form{'c'} =~/$m04/im) {
tu was;
}
Die Bedingung wird seltsamerweise nie erfüllt, auch wenn "suchstring" definitiv in $Form{'c'} enthalten ist. Wo liegt mein Fehler?
Gruß, Dirk
$m04 = "suchstring";
Wie sieht dein Muster tatsächlich aus? Gibt es Warnungen? Wie ist der String aufgebaut, der getestet werden soll? Ansonsten: Benutze *stets* das strict-Pragma und frage Warnungen ab.
Siechfred
$m04 = "suchstring";
Wie sieht dein Muster tatsächlich aus? Gibt es Warnungen? Wie ist der String aufgebaut, der getestet werden soll? Ansonsten: Benutze *stets* das strict-Pragma und frage Warnungen ab.
Siechfred
Das Suchmuster ist dynamisch und wird aus übergebenen Formulardaten extrahiert. Das klappt auch, in $m04 steht tatsächlich das drin, wonach gesucht werden soll. Nein, es gibt keinerlei Warnungen.
Hi,
Das Suchmuster ist dynamisch und wird aus übergebenen Formulardaten extrahiert. Das klappt auch, in $m04 steht tatsächlich das drin, wonach gesucht werden soll. Nein, es gibt keinerlei Warnungen.
Kann es sein, dass in dem Suchmuster Sonderzeichen stehen, die maskiert werden sollten?
Eine Moeglichkeit zum maskieren waere quotemeta().
mfG,
steckl
Eine Moeglichkeit zum maskieren waere quotemeta().
Oder \Q..\E (siehe perlre).
Siechfred
Kann es sein, dass in dem Suchmuster Sonderzeichen stehen, die maskiert werden sollten?
Eine Moeglichkeit zum maskieren waere quotemeta().mfG,
steckl
quotemeta() war die Lösung, danke :-)
Gruß, Dirk
quotemeta() war die Lösung, danke :-)
D.h. du hast Siechfred angelogen, entweder hast du die Warnungen nicht eingeschaltet oder nicht nachgesehen ob wirklich welche angezeigt werden (du musst Perl darum bitten es zu tun) auch vermute ich, dass du kein use strict verwendest, das sind alles Hilfsmittel die dir die Arbeit erleichtern, da du damit solche Fehler schnell findest (und darüber hinaus auch Fehler die du ohne, so gut wie gar nicht findest)
Ausserdem würde ich dir dringend zu der Verwendung des Modul CGI raten, dass Formular eingaben zuverlässig verabreitet und darüber hinaus noch viele Funktionen bietet um einfach HTML Seiten aufzubauen.
Struppi.
Das Suchmuster ist dynamisch und wird aus übergebenen Formulardaten extrahiert. Das klappt auch, in $m04 steht tatsächlich das drin, wonach gesucht werden soll.
Wie wird es extrahiert und wie kann so ein Muster aussehen? Evtl. gibt's Probleme mit unmaskierten Sonderzeichen. Wenn das Muster ein normaler String ist, reicht übrigens index aus.
Ach ja, wie wäre es mit ein bisschen mehr Code?
Siechfred
Hallo zusammen,
ich habe ein Problem mit einem reg. Ausdruck, dessen Suchmuster in einer Variablen steht.
Code:
$m04 = "suchstring";
if($Form{'c'} =~/$m04/im) {
tu was;
}Die Bedingung wird seltsamerweise nie erfüllt, auch wenn "suchstring" definitiv in $Form{'c'} enthalten ist. Wo liegt mein Fehler?
Gruß, Dirk
Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
Du wolltest wohl, dass "$m04" durch "suchstring" ersetzt wird, aber im Kontext des Regexs bedeutet das "$" nur "Suche am Anfang des Strings".
Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
Du wolltest wohl, dass "$m04" durch "suchstring" ersetzt wird, aber im Kontext des Regexs bedeutet das "$" nur "Suche am Anfang des Strings".
Ich denke mal nicht, siehe http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichenketten dort Nr.20
Ich will auch nichts ersetzen, sondern nur prüfen, ob das Suchmuster enthalten ist, sonst nichts.
Hi,
Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
Du wolltest wohl, dass "$m04" durch "suchstring" ersetzt wird, aber im Kontext des Regexs bedeutet das "$" nur "Suche am Anfang des Strings".
Nein, ein "$" am Ende bedeutet Ende des Strings (bzw. der Zeile). Fuer den Anfang gibt es "^".
mfG,
steckl
Hallo Ach,!
Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
Nein: Variableninterpolation findet auch innerhalb der Begrenzugszeichen statt.
Viele Grüße aus Frankfurt/Main,
Patrick
Hi,
Ich kenne Perl zwar nicht, aber davon ausgehend, dass "//" die Delimeter sind, würde ich mal sagen, dass dein Ausdruck einen String sucht, der genau "m04" heißt.
Nein: Variableninterpolation findet auch innerhalb der Begrenzugszeichen statt.
Kleine Ergänzung: aber nicht, wenn als Begrenzungszeichen das ' gewählt wird.
(und, wenn ich mich richtig erinnere, auch nicht, wenn () als Begrenzungszeichen gewählt werden)
cu,
Andreas
Hallo MudGuard!
Nein: Variableninterpolation findet auch innerhalb der Begrenzugszeichen statt.
Kleine Ergänzung: aber nicht, wenn als Begrenzungszeichen das ' gewählt wird.
Klar, da haben die Hochkommata die gleiche Wirkung wie bei Strings:
my $auto = "dem blauen Ding da in der Signatur";
my $str = 'Ich fahre mit $auto'; # keine Interpolation
(und, wenn ich mich richtig erinnere, auch nicht, wenn () als Begrenzungszeichen gewählt werden)
Doch, da auch (zwei erste Beispiele):
my $muster = "Deinem";
my $str = "Ich fahre gerne mit meinem Auto";
$str =~ s(meinem)($muster);
print $str, "\n"; # Ich fahre gerne mit Deinem Auto
$str =~ s($muster)(unserem);
print "$str\n"; # Ich fahre gerne mit unserem Auto
$str =~ s'unserem'$muster';
print "$str"."\n"; # Ich fahre gerne mit $muster Auto
Viele Grüße aus Frankfurt/Main,
Patrick