Thread Probleme beim Auslesen einer Verzeichnisstruktur! (14 answers)
Opened by jason-duff at 2005-12-21 10:47

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.

View full thread Probleme beim Auslesen einer Verzeichnisstruktur!