Hi
Ich schreibe ein Skript das vorhandene Dateien Zeile für Zeile ausliest, den enthaltenen Text auf Dateien / Dateipfade prüft und dann die Existenz der referenzierten Dateien kontrolliert. Ist die Datei nicht vorhanden, wird eine Info ausgegeben.
Aus den Dateien extrahiere ich Zeilenweise Strings die so aussehen können:
soundSet = { name = "bus_modern", horn = "vehicle/truck_modern/horn.wav" }
id = "vehicle/bus/citaro/lod_0_w2.msh",
"vehicle/bus/berkhof_duvedec/berkhof_duvedec_lod_0_w2.msh", "vehicle/bus/berkhof_duvedec/berkhof_duvedec_lod_0_w3.msh",  
 
Ich muss also die Dateipfade irgendwie aus den Strings extrahieren. Mein Ansatz sieht bisher so aus, das ich alle Whitespace-Zeichen entferne und dann mittels regex die Zeichen zwischen den "" extrahiert habe. Das funktioniert allerdings im 3. Beispiel nicht, da dort zwei Dateien referenziert sind. Ebenso wenig im 1. Beispiel, da steht die Referenz auf die Datei erst im zweiten Abschnitt des Strings. Nun stehe ich ein wenig auf dem Schlauch, kann mich da bitte mal in die Richtige Richtung schubsen?
Mein bisher ziemlich schlecht Code für den fraglichen Abschnitt sieht so aus:
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
 
open $filehandle, "<", $file or die "can't open $file\n";
while (<$filehandle>)
{  
my $line=$_;
my $count=0;
$count++ while ($line =~ m/\//g);
            
            if ( $count > 1) 
            { 
                
                
                $line =~ s/^\s+//;
                
                $line =~ ~ s/\s+$//;
                
                $line=~ s/ //g;
                
                $line=~ s/[^\"]*\"//;
                
                my $oper = index($line, '"');
                my $word = substr($line, 0, $oper);
                $line=$word;
                
                
                
                my $searchfile=buildpath($line);
                if ( -e $searchfile )
                {
                    pdebug(1,"found\n");
                }
                else
                {
                    pdebug(1,"not found\n");
                    print "\nunmatched reference in file:\n$file\n";
                    
                    findline($file,$line);
                    print"\ncouldn't find file:\n       $searchfile\nreferenced as:\n$line\n";
                }
            }
}
 
 
Erklärung zu den genutzen subds:
"buildpath" ordnet die jeweilige Dateiendung einem Verzeichnis zu, so liegen .tga Dateien in textures, .wav Dateien in audio/effects und so weiter.
"findline" liest die gegebene Datei zweilenweise ein und gibt die Zeilennummer eines Strings aus sofern er gefunden wurde
"pdebug" nimmt als ersten Parameter das "debuglevel", als zweiten Text den auszugebenden Text. Es gibt den Text aus wenn debuglevel >= dem ersten Parameter ist.
Grüße,
errorsmith
Last edited: 2015-01-06 11:13:44 +0100 (CET)