Thread Regex-Problem mit Backreferences (44 answers)
Opened by DemoFreak at 2004-02-04 14:37

DemoFreak
 2004-02-05 17:58
#79790 #79790
User since
2003-09-06
54 Artikel
BenutzerIn
[default_avatar]
Also, ich hab jetzt mal ein wenig anders probiert, und das scheint zu klappen.

Es tat sich zwischendrin noch ein weiteres Problem auf: die Dateien werden auf Unix-Systemen vorgehalten, wo der Zeilenvorschub (in solchen variablen Feldern wie Kommentaren o.ä.) eigentlich 0x0A sein sollte, allerdings gibt es auch Datensätze, wo die Felder auf Windowsmaschinen gepflegt wurden, wodurch dann die Zeilenenden in diesen variablen Feldern 0x0D0x0A sind. Wenn ich jetzt meinen Script auf einer Unixmaschine ausführe, stimmt die Längenangabe des variablen Strings mit der tatsächlichen Länge überein, wenn ich allerdings denselben Script auf einer Windowsmaschine ausführe, fällt er bei den datensätzen, die diese Windowszeilenumbrüche enthalten, auf die Nase, weil er die zwei Zeichen zu einem Metazeichen zusammenzieht und auch nur einfach zählt. Und sagt mir nicht, dass ich das mittels Setzen von $/ umgehen kann, das kann ich nicht. Hat a) keine Wirkung, und b) musste ich das eh anders setzen, weil die Datensätze in den Dateien mit einem Sonderstring markiert sind. Falls jemand eine Idee hat, wie ich dieses Problem adressieren kann, wäre ich sehr dankbar. Momentan helfe ich mir damit, dass ich nicht akkurat einen String der Länge x herausziehe, sondern einen String der Länge 0..x (greedy bis zum nächsten Leerzeichen). Naja... ;)

Ich poste mal den Code, bitte zerrupfen und mich mit der Nase auf unsinnige Ansätze stoßen, ich bin ein Perl-Anfänger auf dem Weg der Besserung. :D

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
#!/usr/bin/perl

use strict;
use warnings;

local $/ = "====> ";                                      # Datensatzende ist "====>"

my @ind = (4, 8, 22, 29, 34, 36, 38, 40, 42,
              44, 46, 48, 50, 52, 55, 63, 65, 71,
              73, 75, 77, 85, 87, 92, 94, 99, 101,
             106, 108, 113, 115, 120, 122);              # Indice der Längenfelder für VarStrings

my $filename = shift or die "Kein Dateiname angegeben!";
open XY, "<$filename" or die "Konnte Datei $filename nicht oeffnen!";

while (<XY>) {
   my $line = $_;
   if ($. == 1) {
       die "Datei $filename ist scheinbar kein OVO-Historyfile!" unless ($line =~ "Version 3");
       next;
   };
   my $i = 0;
   my $pnt = 0;
   my @parts;
   while (length($line) > 0) {
       $line =~ s/([^ ]+) //; my $part = $1;
       push @parts, $part;
       next if ($pnt > $#ind);
       if ($i == $ind[$pnt]) {
print "Gotcha! $i - ";
           $line =~ s/(.{0,$part}) //s; my $varstr = $1;
print "$varstr\n";
           push @parts, $varstr;
           $pnt++; $i++;
       }
   } continue {
       $i++;
   }
   for ($i=0; $i<=$#parts; $i++) { print "Element $i: $parts[$i]\n"; }
   print "\n";
}

close XY;


Die nicht eingerückten print sind nur zum Debuggen, einfach wegdenken ;)
Gruss, Hannes

View full thread Regex-Problem mit Backreferences