Übung 9 A3
16.06.2010 19:00:02
Ich habe ein kleines Problem mit den Unterverzeichnissen in Aufgabe 3.
Solange ich die Dateien in den Unterverzeichnissen erstmal nicht beachte, funktioniert mein Programm so, wie es verlangt ist und ich kam bislange auch ohne Hashes aus.
Allerdings sieht es so langsam so aus, als müsste ich für die Unterverzeichnisse mein Programm komplett ändern.

Hat jemand eine Idee, wie man strukturiert bei Aufgabe 3 vorgehen kann?
Ich wollte nun zunächst die Unterordner mit einem regulären Ausdruck aussortieren, aber bekomm dann Probleme, die ganzen Dateien in den Unterverzeichnissen irgendwie namentlich abzuspeichern und vor allem auch noch die Unterverzeichnisse der Unterverzeichnisse zu erreichen. Sieht für mich also so aus, als bräuchte man auf jeden Fall Hashes, aber selbst dann bekomme ich mit den Unterverzeichnissen der Unterverzeichnisse Probleme, wenn ich mit einer Schleife alle Dateien in einer Liste bzw. einem Hash speichern will.

Ist das Vorgehen soweit sinnvoll oder gibt es vielleicht eine besser umsetzbare andere Alternative?
Re: Übung 9 A3
16.06.2010 19:41:14
Ich würde eine Funktion schreiben, die alle Dateien in einer Liste zurückgibt und die sich für Unterverzeichnisse selbst aufruft.

Also grob so:

sub listeallerdateien
{
my $verzeichnis = $ARGV[0];
my @liste = ();

# Liste aller Dateien und Verzeichnisse in $verzeichnis im array @kandidaten speichern

foreach $kandidat (@kandidaten)
{

# wenn $kandidat eine Datei ist: "$verzeichnis/$kandidat" in @liste speichern
# ansonsten: rufe rekursiv die Funktion listeallerdateien für "$verzeichnis/$kandidat" auf und füge das Ergebnis @liste hinzu

}
return @liste;
}

Grüße
Tobias Nopper
Lehrstuhl für Betriebssysteme
Re: Übung 9 A3
16.06.2010 20:54:20
Wichtiger Nachtrag:
Für die Verzeichnisse "." und ".." (gibts unter allen Betriebssystemen) solltet ihr keinen rekursiven Aufruf machen, da ihr sonst in eine Endlossschleife rennt.

Grüße
Tobias Nopper
Lehrstuhl für Betriebssysteme
Re: Übung 9 A3
16.06.2010 21:05:01
Dankeschön :)
Mit der Rekursion hat sich mein Problem erledigt.
In der tollen Endlosschleife bin ich allerdings auch schon gelandet und dachte schon, dass was falsch sei, weils nicht mehr abgebrochen hat...
Re: Übung 9 A3
21.06.2010 09:09:27
ich habeein problem beim schritt

"# wenn $kandidat eine Datei ist: "$verzeichnis/$kandidat" in @liste speichern".

ist mein ansatz richtig, wenn ich, um herauszufinden, ob es sich um eine datei handelt, mit einem einzigen regulären ausdruck arbeite, der beinhaltet, dass die zeichenkette mit punkt und zwei bis drei buchstaben enden muss?
oder muss für jeden dateityp eine neue if-schleife mit neuem regulärem ausdruck geschrieben werden?

mein programm schafft es zwar, den array @kandidaten korrekt zu füllen, jedoch wird keine datei in @liste gespeichert, sondern es ruft immer wieder in einer endlos-schleife die funktion rekursiv auf...
Re: Übung 9 A3
21.06.2010 10:04:43
Nein; man kann ja Verzeichnisse und Dateien absolut frei benennen, am Namen kannst Du also nicht festmachen, ob es sich um eine Datei oder ein Verzeichnis handelt. Dazu verwendet man die Dateitest, so ist (-f $name) nur wahr, wenn $name eine Datei ist und (-d $name) nur wahr, wenn $name ein Verzeichnis ist. Schau Dir einfach noch mal die entsprechende Folie an.

Die Frage zu dem rekursiven Endlos-Problem habe ich schon oben beantwortet; für die Verzeichnisse "." und ".." solltest Du keine Rekursion ausführen.

Grüße
Tobias Nopper
Lehrstuhl für Betriebssysteme