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

Regular Expression zurücksetzen?



<< >> 4 Einträge, 1 Seite
simps1
 2007-06-05 13:04
#77243 #77243
User since
2006-03-08
13 Artikel
BenutzerIn
[default_avatar]
Hallo,

Ich habe folgende Regexp:

$var1=~/(.*):(.*)/
if ($1) {...}
$var2=~/(.*)-(.*)/
if ($1) {...}

Wenn nun der zweite Regexp nicht matcht, dann ist im zweiten if dennoch $1 gesetzt - und zwar mit dem Wert aus dem ersten Match. Wie kann ich das umgehen bzw. vor jedem Regexp $1-$n zurücksetzen?

Hoffe, Ihr könnt kurz helfen ...

Vielen Dank und schöne Grüße,
Chris
Linuxer
 2007-06-05 13:10
#77244 #77244
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Prüfe deine Regex auf Erfolg:

Code: (dl )
1
2
3
4
5
6
7
if ( $var1 =~ /$regex/ ) {
## bei erfolg verarbeite $1..$n
}

if ( $var2 =~ /$regex/ ) {
## bei erfolg verarbeite $1..$n
}
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!
renee
 2007-06-05 13:47
#77245 #77245
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Noch schöner finde ich, Variablen zum Einfangen der RegEx-Captures zu verwenden...

z.B.:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my ($eins,$zwei) = 'Test im Test' =~ /(es).*(es)/;
print "$eins -- $zwei\n";

   ($eins,$zwei) = 'Perl ist die beste Sprache' =~ /(es).*(es)/;
print "$eins -- $zwei\n";


Dann kann man auch leichter an den Regulären Ausdrücken etwas ändern. Sonst muss man so viel im Code anfassen.

Beispiel aus:

Code (perl): (dl )
1
2
'Max. 456 Min. 123' =~ /(\d+).*(\d+)/;
print "Maximum ist $1 -- Minimum ist $2\n";
Jetzt ändert sich der String und in der Mitte kommt noch ein Differenzwert, dann müssen mehrere Sachen angepasst werden:

Code (perl): (dl )
1
2
'Max. 456 Diff. 333 Min. 123' =~ /(\d+).*(\d+).*(\d+)/;
print "Maximum ist $1 -- Minimum ist $3 --- Differenz ist $2\n";


Dann vergisst man aber leichter mal das $2 in $3 zu ändern.

Mit Variablen passiert das nicht leicht:
Aus
Code (perl): (dl )
1
2
my ($max,$min) = 'Max. 456 Min. 123' =~ /(\d+).*(\d+)/;
print "Maximum ist $max -- Minimum ist $min\n";


wird
Code (perl): (dl )
1
2
my ($max,$diff,$min) = 'Max. 456 Diff. 333 Min. 123' =~ /(\d+).*(\d+)/;
print "Maximum ist $max -- Minimum ist $min --- Differenz ist $diff\n";


Edit: mit if(...) sollte man dennoch arbeiten, weil man sonst so viele Warnungen mit "uninitialized value" bekommt...\n\n

<!--EDIT|renee|1181037307-->
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/
simps1
 2007-06-05 13:51
#77246 #77246
User since
2006-03-08
13 Artikel
BenutzerIn
[default_avatar]
wow, vielen Dank!!
<< >> 4 Einträge, 1 Seite



View all threads created 2007-06-05 13:04.