Schrift
[thread]8286[/thread]

Regulärer Ausdruck erst beim 2. mal: völlig unlogisch!

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2006-08-31 16:53
#69468 #69468
Hallo, ich hab das Problem schon in anderen Perl-Foren gepostet, aber irgendwie scheinen dort die Leute genauso ratlos wie ich zu sein.

Code: (dl )
1
2
3
4
5
6
7
if ($sl =~ m/\n\s*(Subject.*\n)/gm) {
$mid=$1; print "1st\n";
} else {
if ($sl =~ m/\n\s*(Subject.*\n)/gm) {
$mid=$1; print "2nd\n";
}
}


Nach meinem Verständnis dürfte niemals "2nd" gedruckt werden. Wird es aber. Ich habe Fälle, in denen der reguläre Ausdruck von der ersten if-Schleife als false bewertet wird, dann aber beim else-Teil korrekt als true bewertet wird.

Hat irgendjemand eine Idee, wie das kommt?
renee
 2006-08-31 17:01
#69469 #69469
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hast Du Dir mal $sl ausgeben lassen?
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/
sid burn
 2006-08-31 22:49
#69470 #69470
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Könntest du einen Beispielstring geben wo dies der Fall ist?
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pq
 2006-09-03 19:05
#69471 #69471
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
gegenfrage: warum benutzt du den /g modifier?
der liefert dir alle treffer, aber du fragst ja nur
mit if ab.
im skalaren kontext liefert deshalb /g bei jeder abfrage den nächsten treffer.

lies mal ein bißchen doku zu regexes, hier findest du auch einige ins deutsche übersetzte docs.
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
sid burn
 2006-09-03 19:44
#69472 #69472
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=pq,03.Sep..2006, 17:05]gegenfrage: warum benutzt du den /g modifier?
der liefert dir alle treffer, aber du fragst ja nur
mit if ab.
im skalaren kontext liefert deshalb /g bei jeder abfrage den nächsten treffer.[/quote]
Naja mit der Methode kann man Texte parsen. Allerdings macht es ohne die Option "/c" wenig Sinn.

Den ohne /c fängt man bei einem Fehltreffer wieder von vorne an. Deswegen stimmt es nicht so ganz das im Skalaren Kontext immer der nächste Treffer kommt. (Je nachdem wie man nächster Treffer definiert)\n\n

<!--EDIT|sid burn|1157298767-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
betterworld
 2006-09-03 20:02
#69473 #69473
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=sid burn,03.09.2006, 17:44]Den ohne /c fängt man bei einem Fehltreffer wieder von vorne an.[/quote]
Wenn der regulaere Ausdruck nicht noch einmal matcht, ergibt m//g falsch. Erst beim nächsten Mal wird von vorne angefangen:
Code: (dl )
1
2
3
4
$_ = "Hallo";
print "1: $&\n" if /[A-Z]/g; # Ausgabe: 1: H
print "2: $&\n" if /[A-Z]/g; # Keine Ausgabe
print "3: $&\n" if /[A-Z]/g; # Ausgabe: 3: H

Daher schließe ich, dass in $s1 bei Schlauchsteher der Regexp zweimal matcht.
sid burn
 2006-09-03 20:28
#69474 #69474
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@betterworld
Immer wenn man /g benutzt und ein Treffer war erfolgreich, dann wird die aktuelle Position beibehalten. War ein Treffer hingegen nicht erfolgreich wird die Position "sofort" wieder auf den Anfang zurück gesetzt. Auser man benutzt die Option /c, dann wird trotz fehltreffer die Startposition beibehalten. Ich dachte eigentlich so habe ich es auch geschrieben.

Code: (dl )
1
2
3
4
5
6
$_ = "Hallo!";
m/[A-Z]/g;
print pos, "\n";

m/[A-Z]/g;
print "Von vorne", "\n" if not defined pos;

Ausgabe:
Code: (dl )
1
2
1
Von vorne


Position 1 bedeutet vor dem "a". 0 würde vor dem "H" bedeuten. Und undef heißt die Position wurde resetet.

Wenn also das erste nicht matcht, ist es unmöglich das dass zweite matcht, da beide an der selben Stelle anfangen. Das zweite kann nur matchen wie du sagtest, wenn das erste gematcht hat.

Der Thread starter sagte aber das das erste nicht matcht, das zweite dann aber. Was aber eigentlich unmöglich ist.

Deswegen wollte ich ein Beispielstring haben wo dies der Fall ist, aber es kommt ja nichts mehr weiter.

Ich würde den Fall zu den X-Akten legen.\n\n

<!--EDIT|sid burn|1157301031-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
sesth
 2006-09-10 00:47
#69475 #69475
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Ja, er hat es eingesehen :rock: : http://www.perlboard.de/?id=9179
Gruß
Thomas
pq
 2006-09-10 15:19
#69476 #69476
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
sowas finde ich immer ganz toll, in 3 foren fragen (bei perl.de auch noch)
und dann aber nur in einem selbst antworten. =(
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
Ronnie
 2006-09-10 15:28
#69477 #69477
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wenn sich User mit ähnlich geschmacklosen Nicks hier anmelden hoffe ich das selbige gelöscht werden.
<< >> 10 Einträge, 1 Seite



View all threads created 2006-08-31 16:53.