Schrift
[thread]6057[/thread]

Regex-Problem mit Backreferences (Seite 5)



<< |< 1 2 3 4 5 >| >> 45 Einträge, 5 Seiten
Crian
 2004-02-06 22:02
#79799 #79799
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Klar :)
Es wäre am befriedigendsten, wnen man es hinbekommt, dass es egal ist von wo aus man mit den gemischten Umbrüchen zu tun hat.

auf jeden Fall könnte dabei chr(0x10) und chr(0x15) helfen (ich hoffe ich hab die Zahlen richtig im Kopf), da \n unter Windows anders interpretiert wird als unter Unix.

Beispielsweise könntest Du eine Ersatzfunktion für das verwendete length () schreiben, die die Zeichenkette Zeichen für Zeichen durchgeht und dabei darauf achtet, ob chr(0x10) und chr(0x15) hintereinander vorkommt. Wenn ja wird wieder 1 von der bisherigen Länge abgezogen.

Dann müsste sich obige Lösung verwenden lassen (die mit dem Split).\n\n

<!--EDIT|Crian|1076097787-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-02-06 22:09
#79800 #79800
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Z.B. so (ungetestet in Ermangelung solcher Mischdaten):

Code: (dl )
1
2
3
4
5
6
7
8
sub echte_laenge ($) {
   my @t    = split //, shift;
   my $cnt  = 0;
   for my $i (0..$#t-1) {
       ++$cnt if ord $t[$i] == 0x10 and ord $t[$i+1] == 0x15;
   }
   return scalar(@t) - $cnt;
}


... das baust Du dann hier ein:

Code: (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
#!/usr/bin/perl
use strict;
use warnings;

my @ind = (1, 6);
local $" = "-";

while (<DATA>) {
   print "\n$.: $_";
   my @parts = split;

   for my $i (@ind) {
       print "$.: parts besteht aus ", scalar@parts, " Teilen: @parts\nindex=$i\n";
       if ($parts[$i] eq "0") {
           @parts = (@parts[0..$i], '', @parts[$i+1..$#parts]);
       }
       else {
           while (echte_laenge($parts[$i+1]) < $parts[$i]) {
               if (echte_laenge($parts[$i+1])+1 == $parts[$i]) {
                   $parts[$i+1] .= ' ';
               }
               else {
                   $parts[$i+1] .= ' ' . splice @parts, $i+2, 1;
               }
           }
       }
   }
   print "$.: parts besteht aus ", scalar@parts, " Teilen: @parts\n";

   print "$.: '$parts[2]', '$parts[7]'\n";
}

_ _DATA_ _
Eintrag_eins 20 dies ist interessant blubb bla fasel 42 /home/dummie/meine datei ist so schoen.txt
Eintrag_zwei 0 blubb bla fasel 14 /root/mein.txt
Eintrag_drei 0 blubb bla fasel 0
Eintrag_vier 20 dies ist interessan  blubb bla fasel 42 /home/dummie/meine datei ist so schoen.txt
\n\n

<!--EDIT|Crian|1076098355-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-02-06 22:20
#79801 #79801
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Also so (getestet, aber ohne dass mir solche Umbrüche vorliegen würden):

Code: (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
#!/usr/bin/perl
use strict;
use warnings;

my @ind = (1, 6);
local $" = "-";

sub echte_laenge ($);

while (<DATA>) {
   print "\n$.: $_";
   my @parts = split;

   for my $i (@ind) {
       print "$.: parts besteht aus ", scalar@parts, " Teilen: @parts\nindex=$i\n";
       if ($parts[$i] eq "0") {
           @parts = (@parts[0..$i], '', @parts[$i+1..$#parts]);
       }
       else {
           while (echte_laenge($parts[$i+1]) < $parts[$i]) {
               if (echte_laenge($parts[$i+1])+1 == $parts[$i]) {
                   $parts[$i+1] .= ' ';
               }
               else {
                   $parts[$i+1] .= ' ' . splice @parts, $i+2, 1;
               }
           }
       }
   }
   print "$.: parts besteht aus ", scalar@parts, " Teilen: @parts\n";

   print "$.: '$parts[2]', '$parts[7]'\n";
}

sub echte_laenge ($) {
   my @t    = split //, shift;
   my $cnt  = 0;
   for my $i (0..$#t-1) {
       ++$cnt if ord $t[$i] == 0x10 and ord $t[$i+1] == 0x15;
   }
   return scalar(@t) - $cnt;
}

_ _DATA_ _
Eintrag_eins 20 dies ist interessant blubb bla fasel 42 /home/dummie/meine datei ist so schoen.txt
Eintrag_zwei 0 blubb bla fasel 14 /root/mein.txt
Eintrag_drei 0 blubb bla fasel 0
Eintrag_vier 20 dies ist interessan  blubb bla fasel 42 /home/dummie/meine datei ist so schoen.txt
\n\n

<!--EDIT|Crian|1076098930-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
DemoFreak
 2004-02-07 16:44
#79802 #79802
User since
2003-09-06
54 Artikel
BenutzerIn
[default_avatar]
Das gucke ich mir am Montag mal genauer an. Wenn Du möchtest, kann ich Dir auch mal ein solches Historyfile in komprimierter Form schicken. Dann hast Du was zum Testen. :)
Gruss, Hannes
Crian
 2004-02-07 22:56
#79803 #79803
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wenn es das noch nicht war ist das eine gute Idee :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 4 5 >| >> 45 Einträge, 5 Seiten



View all threads created 2004-02-04 14:37.