Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6401[/thread]

Mit RegEx vergleich durchführen



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Tom
 2004-07-14 20:26
#84323 #84323
User since
2003-09-20
470 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

Ich möchte einen String vergleichen ob er z.B. genau auf "webmaster" passt (genau auf das Wort), das klappt auch. Die RegEx sieht so aus:

Code: (dl )
if ($string =~ /^$name[1]$/i)


Wenn aber die Variable $name den Wert "*webmaster*" enthält, so soll die RegEx auch bei 123webmaster123 usw. anschlagen.

Wie kann ich das lösen???

Danke

Tom
Computerprobleme??? -> http://www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen
pq
 2004-07-14 20:44
#84324 #84324
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
dann musst du die sternchen in perl-wildcards umwandeln:
$name[1] =~ s/\*/.*/g;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Tom
 2004-07-16 00:28
#84325 #84325
User since
2003-09-20
470 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn ich das vor den Vergleich setze funktioniert das auch nicht.

Tom
Computerprobleme??? -> http://www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen
pq
 2004-07-16 00:39
#84326 #84326
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
aha, mal wieder einer mit einem kaputten perl.
meins (5.8.3, linux) macht, was es soll:
Code: (dl )
1
2
3
4
5
6
7
8
9
$ perl -wle'
$string = "123webmaster123";
$name = "*webmaster*";
$name =~ s/\*/.*/g;
if ($string =~ m/^$name$/i) {
print qq{"$string" matches "$name"}
}'
"123webmaster123" matches ".*webmaster.*"
$
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2004-07-16 00:44
#84327 #84327
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Du musst bei so etwas verdammt aufpassen, wenn Du es in CGI-Skripten benutzt. Denn wenn ein eingebetteter RE einen Syntaxfehler beinhaltet, kann damit das Programm abgebrochen werden:
Code: (dl )
1
2
$ perl -e 'my $re = "(broken"; "hallo" =~ /$re/;'
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE broken/ at -e line 1.

Ich nehme mal an, dass $name etwas ist, was vom User eingegeben wird. So etwas sollte nie in einem Regulaeren Ausdruck auftauchen (es sei denn, hinter \Q, siehe perldoc perlre).

Als "sichere" Loesung fuer Dein Problem wuerde ich vorschlagen:
Code: (dl )
1
2
3
4
5
my $begin = $name =~ s/^\*// ? qr// : qr/^/;
my $end = $name =~ s/\*$// ? qr // : qr/$/;
if ($string =~ /$begin\Q$name\E$end/) {
...
}
Tom
 2004-07-16 21:00
#84328 #84328
User since
2003-09-20
470 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=betterworld,15.07.2004, 22:44]Als "sichere" Loesung fuer Dein Problem wuerde ich vorschlagen:
Code: (dl )
1
2
3
4
5
my $begin = $name =~ s/^\*// ? qr// : qr/^/;
my $end = $name =~ s/\*$// ? qr // : qr/$/;
if ($string =~ /$begin\Q$name\E$end/) {
...
}
[/quote]
Das funktioniert aber auch nicht.

In die Variable $beginn schreibt Perl "(?-xism:^)" ist das so richtig???

Ich brauche das für ein CGI-Script, außerdem verwende ich noch Perl 5.6.1 (Windows)

Tom
Computerprobleme??? -> http://www.weber-computerhilfe.de

Fordere keine Anerkennung!
Zeige was und man wird Dich kennen
betterworld
 2004-07-16 21:13
#84329 #84329
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Tom,16.07.2004, 19:00]Das funktioniert aber auch nicht.[/quote]
Ich habe den Code doch getestet. Zeig doch mal, was Du fuer "..." eingesetzt hast und was bei Dir $name und $string ist.

Code: (dl )
In die Variable $beginn schreibt Perl "(?-xism:^)" ist das so richtig???

Ja, das ist ok. Das liegt daran, dass die Variable kein String sondern ein Regulaerer Ausdruck ist (deswegen qr und nicht qq). Ich weiss auch grad nicht, wofuer xism genau steht, aber bei mir steht das auch, wenn ich es printe.
betterworld
 2004-07-16 21:25
#84330 #84330
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Also, hier noch mal das ganze Skript:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;

my @names = qw/webmaster *webmaster webmaster*/;

for my $string (qw/Alfred webmaster wwwebmaster webmasters/) {
for (0..$#names) {
my $name = $names[$_];

print "$name matcht auf $string ";
my $begin = $name =~ s/^\*// ? qr// : qr/^/;
my $end = $name =~ s/\*$// ? qr// : qr/$/;
if ($string =~ /$begin\Q$name\E$end/) {
print "sehr gut.";
} else {
print "nicht.";
}
print "\n";
}
}

Ausgabe davon ist:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
webmaster matcht auf Alfred nicht.
*webmaster matcht auf Alfred nicht.
webmaster* matcht auf Alfred nicht.
webmaster matcht auf webmaster sehr gut.
*webmaster matcht auf webmaster sehr gut.
webmaster* matcht auf webmaster sehr gut.
webmaster matcht auf wwwebmaster nicht.
*webmaster matcht auf wwwebmaster sehr gut.
webmaster* matcht auf wwwebmaster nicht.
webmaster matcht auf webmasters nicht.
*webmaster matcht auf webmasters nicht.
webmaster* matcht auf webmasters sehr gut.

Wenn bei Dir etwas anderes rauskommt, Tom, dann ist Dein Perl wohl wirklich kaputt ;-)

Beachte, dass die Variable $name veraendert wird hierbei. Man sollte sie also hinterher nicht wiederverwenden.\n\n

<!--EDIT|betterworld|1089999035-->
ptk
 2004-07-16 21:37
#84331 #84331
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=betterworld,16.07.2004, 19:13]Ja, das ist ok. Das liegt daran, dass die Variable kein String sondern ein Regulaerer Ausdruck ist (deswegen qr und nicht qq). Ich weiss auch grad nicht, wofuer xism genau steht, aber bei mir steht das auch, wenn ich es printe.[/quote]
-xism bedeutet, dass die Regexp-Flags x, i, s und m ausgeschaltet sind. Wenn beispielsweise die "auessere" Regexp per /.../i case-insensitive arbeitet, dann ist die "innere" Regexp trotzdem noch case-sensitive.
pq
 2004-07-16 22:54
#84332 #84332
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@Tom: Wissensbasis.AllgemeinesSkriptFunktioniertNicht
nur so als tip für weitere postings :)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-07-14 20:26.