Schrift
[thread]12534[/thread]

Array sortieren



<< >> 7 Einträge, 1 Seite
~Br4inP4in~
 2008-09-23 16:56
#114870 #114870
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hi.

Folgendes Problem:

Ich habe ein Array mit einer rekursiven Verzeichnisliste, dessen Inhalt in etwa so ausschaut:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
file1.txt
bla.mp3
verzeichnis1/bla.txt
verzeichnis1/bla2.txt
verzeichnis2/test.jpg
verzeichnis2/verzeichnis3/test1.txt
verzeichnis2/verzeichnis3/test2.txt
verzeichnis2/verzeichnis3/test3.jpg
verzeichnis2/verzeichnis4/bla.gif
...


Ich würde nun gern immer auf die Elemente EINES Verzeichnisses zugreifen und damit weiter verfahren, bis ich beim nächsten Verzeichnis angekommen bin.
Fürs Rootverzeichnis wäre das ja einfach, da könnte ich per regulärem Ausdruck nach '/' suchen...
Für alle weiteren Verzeichnisse finde ich allerdings keine Lösung, da ich nicht weiss, wie ich Perl die variablen Verzeichnisnamen beibringen soll.
Außerdem wäre eine elegante Methode natürlich schöner als eine riesige Routine dafür.
Hat jemand einen Vorschlag?
moritz
 2008-09-23 17:14
#114871 #114871
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich verstehe nicht genau, was dein problem ist. Wenn die Einträge lexikographisch sortiert sind, sind alle Einträge eines Unterverzeichnisses automatisch beieinander, und du kannst einfach durch die Liste laufen.
~Br4inP4in~
 2008-09-23 17:30
#114873 #114873
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Ja. Okay, das Problem dabei ist folgendes:
Ich möchte für jedes Verzeichnis individuell verfahren.
Es geht dabei um eine relativ komplexe Art, die Dateinamen in jedem Verzeichnis auf ihre art zu ändern, was allerdings durch einen (sich in jedem Verzeichnis unterscheidenden) Input vom User abstrahiert werden soll.
Kannst du mir jetzt folgen?
moritz
 2008-09-23 17:45
#114874 #114874
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
So langsam fängt das ganze an, Sinn zu machen.

Ich würde folgendes machen:
Code: (dl )
1
2
3
4
5
my %dirs;
Für jedes Element von @files
finde den Teil heraus, der das Verzeichnis darstellt, speichere in $dir
finde den Teil heraus, der den dateinamen darstellt, speichere in $file
push @{$dirs{$dir}}, $file


Beim Aufteilen in Dateinmamen und Verzeichnis kann dir File::Spec->splitpath helfen.

Danach kannst du durch alle Verzeichnissse Laufen:

Code (perl): (dl )
1
2
3
4
5
6
while (my ($dir, $files) = each %dirs) {
   print "I'm now looking at $dir\n";
   for (@$files){
       print "  ... and considering file '$_'\n"
   }
}
~Br4inP4in~
 2008-09-23 18:54
#114882 #114882
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Super, genau so hab ich mir das vorgestellt!
Verstehe ich das richtig, dass dieses Konstrukt zulässt, einem Hash-Key mehrere Values zuzuweisen
Code (perl): (dl )
push @{$dirs{$dir}}, $file

oder was macht das genau?

Danke dir, moritz! Habe mal wieder komplizierter gedacht als nötig gewesen wäre ;)
nepos
 2008-09-23 19:24
#114885 #114885
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Der Wert hinter dem Hash-Key ist in dem Fall eine Array-Referenz.
moritz
 2008-09-24 00:52
#114895 #114895
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
~Br4inP4in~+2008-09-23 16:54:15--
Super, genau so hab ich mir das vorgestellt!
Verstehe ich das richtig, dass dieses Konstrukt zulässt, einem Hash-Key mehrere Values zuzuweisen
Code (perl): (dl )
push @{$dirs{$dir}}, $file

oder was macht das genau?


Fast. Es speichert in dem Hash für jeden Key eine Arrayreferenz, in der man beliebig viele Dinge speichern kann.
<< >> 7 Einträge, 1 Seite



View all threads created 2008-09-23 16:56.