Schrift
[thread]7761[/thread]

matching

Leser: 1


<< >> 10 Einträge, 1 Seite
Froschpopo
 2006-03-05 06:01
#63456 #63456
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Folgender Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;

my @tests = (
"([0d-w9]ef+?)q"
);
my $string = $ARGV[0];

for my $line (@tests) {
if ($string =~ /$line/) {
print "Muster $line erkannt\n";
}
}

in @tests befinden sich eine Reihe von Mustern die ich alle prüfen will.
Das funktioniert auch soweit. Aber im obigen Beispiel befindet sich ein syntaxfehler in $tests[0], der komischerweise im Matching nicht erkannt bzw debugged wird. Warum?
Ich habe ein ganzes Array voll mit Mustern. Ich möchte mir eigentloich gerne ersparen, für jedes matching einen eigenen regex schreiben zu müssen. Hat jemand vielleicht eine bessere idee als die oben abgebildete?
pq
 2006-03-05 11:38
#63457 #63457
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich versteh dein problem nicht ganz. wo befindet sich deiner meinung nach
ein syntaxfehler? ist doch alles in ordnung...
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
renee
 2006-03-05 15:06
#63458 #63458
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, der RegEx ("([0d-w9]ef+?)q") sieht etwas komisch aus...

Du kannst auch so etwas machen:
Code: (dl )
1
2
3
4
5
6
7
my @regexes = ('([\d\w]+)', 'another Regex');

my $regex = join('|',@regexes);

if($string =~ /($regex)/){
print $1;
}


Dann brauchst Du auch die for-Schleife nicht mehr...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2006-03-05 16:37
#63459 #63459
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aber es gibt auch hier einen unterschied, dass er keine meldung im Fall eines Syntaxfehlers ausgibt! Das macht er nur, wennn ich Das Matchmuster direkt in den Regex schreibe.
Linuxer
 2006-03-05 18:53
#63460 #63460
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,
schon mal den qr// Operator genutzt?
perldoc perlop
http://perldoc.perl.org/perlop.....-escape

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my @list = (
qr/pattern1/,
qr/pattern2/,
qr/pattern3/,
qr{patter/patter not},
);

for my $line (@list ) {
if ( $string =~ $line ) { print "match\n"; }
}


qr// sollte Dir einen Fehler geben, sollte das definierte Pattern fehlerhaft sein. Somit kannst Du im Prinzip die Pattern prüfen lassen, bevor Du sie verwenden willst.

Btw. das Pattern "([0d-w9]ef+?)q" mag komisch ausschauen, ist aber syntaktisch korrekt!

Renees Code liefert Fehlermeldung bei fehlerhaftem Pattern:
Quote
$ perl
# achte auf die geöffnete Klammer im 2. Pattern
my @regexes = ('([\d\w]+)', 'another (Regex');

my $regex = join('|',@regexes);

if($string =~ /($regex)/){
print $1;
}
^D
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE ([\d\w]+)|another (Regex)/ at - line 6.
$
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
GwenDragon
 2006-03-05 19:06
#63461 #63461
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
Am besten prüfst du das Pattern, in dem ein eval auf qr/../ ausführst. Also:

Code: (dl )
1
2
eval { qr/pattern/ };
die "Patternfehler!" if $@;
\n\n

<!--EDIT|GwenDragon|1141578516-->
Froschpopo
 2006-03-05 19:12
#63462 #63462
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
die idee mit eval kam mir auch schon, aber das wäre doch performancebelastend! Und zu join(): ist das nicht langsamer als ne schleife?
renee
 2006-03-05 19:47
#63463 #63463
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Linuxer,05.03.2006, 17:53][...]

Btw. das Pattern "([0d-w9]ef+?)q" mag komisch ausschauen, ist aber syntaktisch korrekt!

Renees Code liefert Fehlermeldung bei fehlerhaftem Pattern:
Quote
$ perl
# achte auf die geöffnete Klammer im 2. Pattern
my @regexes = ('([\d\w]+)', 'another (Regex');

my $regex = join('|',@regexes);

if($string =~ /($regex)/){
print $1;
}
^D
Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE ([\d\w]+)|another (Regex)/ at - line 6.
$
[/quote]
Ich habe ja nicht behauptet, dass er syntaktisch falsch ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Linuxer
 2006-03-05 20:23
#63464 #63464
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
[quote=renee,05.03.2006, 18:47]> [...]
> Btw. das Pattern "([0d-w9]ef+?)q" mag komisch ausschauen, ist aber syntaktisch korrekt!
> [...]
Ich habe ja nicht behauptet, dass er syntaktisch falsch ist...[/quote]
Das wollt ich Dir auch nicht unterstellen. Du hast es aber nicht nochmal explizit betont ;o)
Ich wollte das für den OP nochmal betonen ...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
ptk
 2006-03-05 20:40
#63465 #63465
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Froschpopo,05.03.2006, 18:12]die idee mit eval kam mir auch schon, aber das wäre doch performancebelastend! Und zu join(): ist das nicht langsamer als ne schleife?[/quote]
Guck genau hin: es ist kein String-eval, also nicht performancebelastend. Und bei Perl gilt meistens die Regel: je weniger Opcodes verbraucht werden, desto schneller der Code.
<< >> 10 Einträge, 1 Seite



View all threads created 2006-03-05 06:01.