Thread Perl Regular Expression - merkwürdiges Verhalten (16 answers)
Opened by GoodFella at 2007-03-24 00:04

GoodFella
 2007-03-24 15:35
#75307 #75307
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
@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
anrede_col = 0
anrede_replace = 1
anrede_vorsatz = Sehr geehrte
case_m = 0
case_w = 0
nachname_col = 3
name_vorsatz_col = 7
reduce_whitespaces = 1
remove_n = 0
sex_col = 0
sex_m = Herr,Herrn
sex_w = Frau
status = 1
titel_add = 1
titel_col = 7
titel_search_anrede = 1
titel_search_name = 1
titel_search_prename = 1
vorname_col = 2
zusatz_add = 1
zusatz_search_anrede = 1
zusatz_search_name = 1
zusatz_search_prename = 1





ba_config{'sex_col'} = 0, sex_cmp = Herr, ba_config{'sex_m'} = Herr,Herrn, ba_config{'sex_w'} = Frau
H = 72, e = 101, r = 114, r = 114,  <--------> H = 72, e = 101, r = 114, r = 114,
('sex_cmp' =~ 'male_cmp') --> ('Herr' =~ 'Herr')
CHECK 1 MANUALLY: ""
CHECK 2 MANUALLY: ""
CHECK 3 MANUALLY: "1"
CHECK 4 MANUALLY: "1"
INNERHALB (case_m == 0), male_cmp = Herr, sex_cmp = Herr
sex_r = none
H = 72, e = 101, r = 114, r = 114, n = 110,  <--------> H = 72, e = 101, r = 114, r = 114,
('sex_cmp' =~ 'male_cmp') --> ('Herr' =~ 'Herrn')
CHECK 1 MANUALLY: ""
CHECK 2 MANUALLY: ""
CHECK 3 MANUALLY: ""
CHECK 4 MANUALLY: ""
INNERHALB (case_m == 0), male_cmp = Herrn, sex_cmp = Herr
sex_r = none
sex_r = none
F = 70, r = 114, a = 97, u = 117,  <--------> H = 72, e = 101, r = 114, r = 114,
('sex_cmp' =~ 'female_cmp') --> ('Herr' =~ 'Frau')
CHECK 1 MANUALLY: ""
CHECK 2 MANUALLY: ""
CHECK 3 MANUALLY: ""
CHECK 4 MANUALLY: ""
INNERHALB (case_w == 0), female_cmp = Frau, sex_cmp = Herr
sex_r = none
sex_r = none


.. hiervon jetzt sehr viel, hier mal etwas, wo sex_cmp weiblich ist:


ba_config{'sex_col'} = 0, sex_cmp = Frau, ba_config{'sex_m'} = Herr,Herrn, ba_config{'sex_w'} = Frau
H = 72, e = 101, r = 114, r = 114,  <--------> F = 70, r = 114, a = 97, u = 117,
('sex_cmp' =~ 'male_cmp') --> ('Frau' =~ 'Herr')
CHECK 1 MANUALLY: ""
CHECK 2 MANUALLY: ""
CHECK 3 MANUALLY: ""
CHECK 4 MANUALLY: ""
INNERHALB (case_m == 0), male_cmp = Herr, sex_cmp = Frau
sex_r = none
H = 72, e = 101, r = 114, r = 114, n = 110,  <--------> F = 70, r = 114, a = 97, u = 117,
('sex_cmp' =~ 'male_cmp') --> ('Frau' =~ 'Herrn')
CHECK 1 MANUALLY: ""
CHECK 2 MANUALLY: ""
CHECK 3 MANUALLY: ""
CHECK 4 MANUALLY: ""
INNERHALB (case_m == 0), male_cmp = Herrn, sex_cmp = Frau
sex_r = none
sex_r = none
F = 70, r = 114, a = 97, u = 117,  <--------> F = 70, r = 114, a = 97, u = 117,
('sex_cmp' =~ 'female_cmp') --> ('Frau' =~ 'Frau')
CHECK 1 MANUALLY: ""
CHECK 2 MANUALLY: ""
CHECK 3 MANUALLY: "1"
CHECK 4 MANUALLY: "1"
INNERHALB (case_w == 0), female_cmp = Frau, sex_cmp = Frau
sex_r = none
sex_r = none


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:

Code (perl): (dl )
1
2
utf8::downgrade($male_cmp);
utf8::downgrade($sex_cmp);


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-->

View full thread Perl Regular Expression - merkwürdiges Verhalten