Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7560[/thread]

Probleme beim Auslesen einer Verzeichnisstruktur! (Seite 2)

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
jason-duff
 2005-12-21 17:28
#61204 #61204
User since
2005-10-11
23 Artikel
BenutzerIn
[default_avatar]
hallo,
habe es jetzt so gemacht.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use File::Find;

my $var = '';
my @files = ();
my $startdir = '.';

sub process_item{
push(@files,$File::Find::dir) if(-f $_ && !-e $File::Find::dir );
}

find(\&process_item, $startdir);

print join("\n", (@files));


Ich suche nach jeder Datei und speichere den Pfad dazu ab. Befinden sich mehrere Dateien in einem Ordner so wird immer überprüft ob der Pfad bereits existiert. wenn ja, dann speichere ihn nicht ab.
Damit ich dann nicht immer den gleichen Pfad mehrmals drin hab.

Aber er kopiert mir trotzdem den Pfad mehrmals ab, wenn er mehrere Dateien in dem selben Ordner finden.

Code: (dl )
if(-f $_ && !-e $File::Find::dir );

muss doch so stimmen mit der Bedingung oder?
es funzt aber nicht...
gruss jason\n\n

<!--EDIT|jason-duff|1135179259-->
murphy
 2005-12-21 19:18
#61205 #61205
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
1. Deine Bedingung ist Unfug, denn übersetzt bedeutet
Code: (dl )
if (-f $_ && !-e $File::Find::dir) ...

nichts anderes als "falls $_ eine reguläre Datei ist und $File::Find::dir nicht existiert ...". Da File::Find für die Bearbeitung der wanted Subroutine in das Verzeichnis wechselt, in dem die betreffenden Dateien liegen, ist die zweite Bedingung in der Regel immer wahr, denn $File::Find::dir enthält keinen absoluten Pfad. Folglich sammelst du in deinem Array sämtliche Verzeichnisse in denen reguläre Dateien liegen mehrfach an.

2. Ich verstehe nicht, wieso du unbedingt die Verzeichnisse erst in ein Array packen willst, aber ich hätte folgende Lösung für dich anzubieten:
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
use strict;
use warnings;

use File::Find;
no warnings 'File::Find';

my %dirs = ();
my $startdir = '.';

sub filter_for_rrd {
 # filtere aus dem Verzeichnis alle rrd dateien heraus
 my @files = grep /\.rrd$/, @_;
 # filtere alle Unterverzeichnisse heraus
 my @dirs = grep -d, @_;
 # falls rrd Dateien vorhanden waren, speichere das Verzeichnis
 # samt der Liste der Dateien in %dirs
 $dirs{$File::Find::dir} = \@files if (@files);
 # gib für File::Find die Liste der Verzeichnisse und der rrd Dateien
 # zurück
 return @dirs, @files;
}

sub process_rrd {
 if (-f $_) {
   # bearbeite einzelne rrd Datei hier, oder lasse die ganze
   # process_rrd Subroutine einfach leer.
 }
}

find({
     preprocess => \&filter_for_rrd,
     wanted => \&process_rrd },
    $startdir);

# %dirs enthält jetzt einen Hash, dessen keys die Pfade zu allen
# Verzeichnissen mit rrd Dateien sind und dessen values jeweils
# Referenzen auf Arrays mit den rrd Dateien sind.

use Data::Dumper;
print Dumper \%dirs;


(edit: typo in regex behoben)\n\n

<!--EDIT|murphy|1135186103-->
When C++ is your hammer, every problem looks like your thumb.
murphy
 2005-12-21 19:21
#61206 #61206
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
edit: Doppelten Beitrag gelöscht. Wieso gabs den überhaupt doppelt?\n\n

<!--EDIT|murphy|1135185800-->
When C++ is your hammer, every problem looks like your thumb.
jason-duff
 2005-12-21 19:37
#61207 #61207
User since
2005-10-11
23 Artikel
BenutzerIn
[default_avatar]
hallo,

das ist echt der Hammer. Das ist genau das was ich haben wollte....
wäre selber echt nicht draufgekommen.
vielen vielen dank....

hast mir den abend noch gerettet.....

gruss Jason
murphy
 2005-12-21 20:51
#61208 #61208
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=jason-duff,21.12.2005, 17:37][...] hast mir den abend noch gerettet..... [...][/quote]
Ich finde, man sollte sich von seinem Code grundsätzlich nicht den Abend versauen lassen, also bin ich froh, dass mein Snippet geholfen hat ;)
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2005-12-21 10:47.