Schrift
[thread]494[/thread]

regex problem



<< >> 7 Einträge, 1 Seite
devil_86
 2005-05-17 23:51
#4957 #4957
User since
2004-05-25
12 Artikel
BenutzerIn
[default_avatar]
also vorweg, reguläre ausdrücke sind nun wirklich nicht meine stärke *g*

so mal ein vereinfachtes beispiel meines quellcodes schnippsels mit dem problem.

Code: (dl )
1
2
3
4
$str='cbbbaaabbbc';
$str=~m/bbb(.*)bbb/;
$a=$1; # $a='aaa';
...


dann bekommt $str einen neuen wert, und das ganze nochmal mit einem anderen muster ...

Code: (dl )
1
2
3
4
...
$str='caaabbbaaac';
$str=~m/aaa(.*)aaa/;
$b=$1; # sollte jetzt bbb sein, ist aber noch aaa


ok (.*) ist recht einfach gehalten aber hat schon seinen zweck erfüllt :)

so und das problem ist nun das $b den selben wert hat wie $a hat weil sich $1 scheinbar nachdem 2 regex match nicht verändert. mit undef kann man die noch nicht mal den wert entziehen weil diese speziellen variablen ja nur zum lesen sind. so müsste nach dem 2. regex match $1 einen neuen wertbekommen oder muss ich das noch irgendwie beeinflussen?

danke im voraus für eure antworten, bin mir sicher ihr habt die lösung :)\n\n

<!--EDIT|devil_86|1116360304-->
betterworld
 2005-05-18 00:09
#4958 #4958
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn ich Deine sechs Zeilen ausfuehre, steht in $b danach "bbb", und nicht etwa "aaa".
devil_86
 2005-05-18 00:26
#4959 #4959
User since
2004-05-25
12 Artikel
BenutzerIn
[default_avatar]
hmm stimmt :D, ok war vielleicht zu entfernt von meinem problem code :)

Code: (dl )
1
2
3
4
5
6
7
8
9
$str='x: name: wert ';
$str=~m/x: (.*): /;
$name=$1;

$str='caaabbbaaac';
$str=~m/x: $name: (.*) /;
$wert=$1;

print $name.':'.$wert;


das soll "name:wert" ausgeben, gibt aber "name:name" aus

liegt das vielleicht an der $name variable im 2. regex?
Dubu
 2005-05-18 00:46
#4960 #4960
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Dein Problem: Wenn eine Regexp nicht matcht, dann behalten die Positionsvariablen $1, $2 etc. ihren alten Wert vom letzten Match!

Deshalb soll man immer daran denken zu pruefen, ob ein Match auch klappt:
Code: (dl )
1
2
3
4
if ($str =~ m/x: $name: (.*) /) {
   # $str matcht!
   $wert = $1;
}
devil_86
 2005-05-18 01:12
#4961 #4961
User since
2004-05-25
12 Artikel
BenutzerIn
[default_avatar]
danke dubu, das ist logisch, hab daran nur nicht gedacht weil ich davon ausgehe das der 2. match immer etwas findet

ich idiot hab noch vergessen was im 2. bsp zu ändern, die 2. änderung von $str

hier mal so wie es jetzt funktioniert

Code: (dl )
1
2
3
4
5
6
7
8
9
$str='x: name: wert1 ';
$str=~m/x: (.*): /;
$name=$1;

$str='x: name: wert2 ';
$str=~ m/x: $name: (.*) /;
$wert=$1;

print $name.':'.$wert;


C:\Dokumente und Einstellungen\i>perl x.pl
name:wert2

hmm so, im richtigen quelltext geht das zwar immer noch nicht, aber ich glaube das schlaf ich erstmal ne nacht drüber :D, bestimmt nur wieder ein dummer tipfehler oder so.

erstmal danke für eure hilfe
Dubu
 2005-05-18 01:22
#4962 #4962
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Bitte, bitte, verlass dich nicht darauf, dass deine Regexp passt!

Selbst wenn du dir sicher bist, dass sie immer passt, mach doch einen Test, bevor du dir mit deinem Code in den Fuss schiesst. Am besten mit einer if-Bedingung, wie ich es oben gezeigt habe, aber zumindest mit einem Notausgang:
Code: (dl )
1
2
$str =~ m/...../ or die "Aaaah! Das darf nicht sein!";
$wert = $1;

Was weiss ich ...
devil_86
 2005-05-18 08:44
#4963 #4963
User since
2004-05-25
12 Artikel
BenutzerIn
[default_avatar]
ja generel hast du schon recht, aber in dem fall ist das nicht so wichtig, wenn der regex nicht zutrifft wird das script zu einem späteren zeit punkt als konsiquenz mit einer fehlermeldung beendet, da brauch ich nicht noch ein zusätzliches if :)

so ... ausgeschlafen ging alles gleich wieder viel einfacher :D

der 2. regex traf nicht zu weil der interpreter die variable (in dem einfachen bsp hier) nicht rausfinden konnte, hab das jetzt so behoben wie ich das von bash kenne

$str=~ m/x: ${name_1}_text: (.*) /;

und es tut jetzt :)

aber danke für eure hilfe ;)
<< >> 7 Einträge, 1 Seite



View all threads created 2005-05-17 23:51.