Thread Perl Regular Expression - merkwürdiges Verhalten
(16 answers)
Opened by GoodFella at 2007-03-24 00:04
@Perlprofi & kristian: Genau das habe ich in den 4 Stunden vorher getan, dachte mir, ihr glaubt mir vielleicht, dass es daran nicht liegen kann; hier jetzt der vollständige Codepart dazu:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #Geschlechtsidentifikations-R $assigned_col = (defined($excel_assign{"$eo,$sheet"}[$ba_config{'sex_col'}])) ? ($excel_assign{"$eo,$sheet"}[$ba_config{'sex_col'}]) : ($ba_config{'sex_col'}); $sex_cmp = $current_sheet->{Cells}->[$row]->[$assigned_col]->{Val}; $sex_r = $none; &debug("\n\nba_config{'sex_col'} = $ba_config{'sex_col'}, sex_cmp = $sex_cmp, ba_config{'sex_m'} = $ba_config{'sex_m'}, ba_config{'sex_w'} = $ba_config{'sex_w'}"); foreach my $male_cmp (split(/,/,$ba_config{'sex_m'})) { my $test_chr = ''; $test_chr .= "$_ = ".ord($_).', ' for(split(//,$male_cmp)); $test_chr .= " <-------->;;;;; "; $test_chr .= "$_ = ".ord($_).', ' for(split(//,$sex_cmp)); &debug ($test_chr); &debug ("('sex_cmp' =~ 'male_cmp') -->;;;;; ('$sex_cmp' =~ '$male_cmp')"); &debug ('CHECK 1 MANUALLY: "'.($sex_cmp =~ /^\s*$male_cmp\s*$/si).'"'); &debug ('CHECK 2 MANUALLY: "'.($sex_cmp =~ /^\s*$male_cmp\s*$/sgi).'"'); &debug ('CHECK 3 MANUALLY: "'.($sex_cmp eq $male_cmp).'"'); &debug ('CHECK 4 MANUALLY: "'.($sex_cmp =~ /$male_cmp/si).'"'); if($ba_config{'case_m'} == 1) { &debug('INNERHALB (case_m == 1), '."male_cmp = $male_cmp, sex_cmp = $sex_cmp"); $sex_r = 'r' if ($sex_cmp =~ /^\s*$male_cmp\s*$/s); &debug("sex_r = $sex_r"); } else { &debug('INNERHALB (case_m == 0), '."male_cmp = $male_cmp, sex_cmp = $sex_cmp"); $sex_r = 'r' if ($sex_cmp =~ /^\s*$male_cmp\s*$/si); &debug("sex_r = $sex_r"); } last if($sex_r ne $none); } &debug("sex_r = $sex_r"); foreach my $female_cmp (split(/,/,$ba_config{'sex_w'})) { my $test_chr = ''; $test_chr .= "$_ = ".ord($_).', ' for(split(//,$female_cmp)); $test_chr .= " <-------->;;;;; "; $test_chr .= "$_ = ".ord($_).', ' for(split(//,$sex_cmp)); &debug ($test_chr); &debug ("('sex_cmp' =~ 'female_cmp') -->;;;;; ('$sex_cmp' =~ '$female_cmp')"); &debug ('CHECK 1 MANUALLY: "'.($sex_cmp =~ /^\s*$female_cmp\s*$/si).'"'); &debug ('CHECK 2 MANUALLY: "'.($sex_cmp =~ /^\s*$female_cmp\s*$/sgi).'"'); &debug ('CHECK 3 MANUALLY: "'.($sex_cmp eq $female_cmp).'"'); &debug ('CHECK 4 MANUALLY: "'.($sex_cmp =~ /$female_cmp/si).'"'); if($ba_config{'case_w'} == 1) { &debug('INNERHALB (case_w == 1), '."female_cmp = $female_cmp, sex_cmp = $sex_cmp"); $sex_r = '' if ($sex_cmp =~ /^\s*$female_cmp\s*$/s); &debug("sex_r = $sex_r"); } else { &debug('INNERHALB (case_w == 0), '."female_cmp = $female_cmp, sex_cmp = $sex_cmp"); $sex_r = '' if ($sex_cmp =~ /^\s*$female_cmp\s*$/si); &debug("sex_r = $sex_r"); } last if($sex_r ne $none); } &debug("sex_r = $sex_r"); ergibt (vorher lass ich mir noch %ba_config ausgeben, ich paste das einfach mal mit) Quote Man sieht, die zu vergleichenden Wörter sind absolut INDENTISCH. Sonst hätte ich hier auch gar nicht gepostet ;) @Relais: Zeichen, die für eine Regex von Bedeutung sind, können eigentlich gar nicht in den Daten vorkommen, die ich benutze, werde jetzt aber trotzdem mal einen Test mit Deinem Vorschlag machen. [EDIT]: Wie erwartet macht \Q und \E keinen Unterschied, schliesslich sind in meinen Testdaten keine Metazeichen enthalten. ALLERDINGS: Ich habe mal zum Spass folgendes eingebaut: So funktioniert es wie erwartet!!! Darüber kann ich mich jetzt aber überhaupt nicht freuen, dass heisst ja, dass ich jetzt vor JEDES Regex immer die beiden Codeparts schreiben muss. Das muss doch auch anders gehen. Warum ist das überhaupt so, ich hatte jahrelang niemals Probleme damit. Weiss jemand eine Lösung? Die Daten kommen übrigens von Spreadsheet::ParseExcel + einem Tk::Entry.\n\n <!--EDIT|GoodFella|1174744068--> |