einlesen und "on the fly" sortieren?
$xNeTworKx
- perl
Hallo,
Ich lese Dateien ein, die so aussehen-> 125764675.cgi .Diese Dateien würde ich gerne so sortieren, dass immer die Neueste als Erste ausgegeben wird. An und für sich kein Problem, aber was mich stört ist, dass ich nicht weis, wie ich die Dateien gleich während dem Einlesen des Verzeichnisses sortieren kann. Ich habe bisher immer alle Files in einer Liste gesammelt und dann mit foreach (sort{$b cmp $a}@files) ausgeben.
Kann man die Files überhaupt schon während des Einlesens sortieren? Ich frage mich das deshalb, weil das Script ja noch nicht weis, welche Dateien noch kommen. Allerdings verstehe ich zu wenig von perlinternen Prozessen.
Wie könnte ich folgendes Beispiel so ändern, dass ich es nicht in eine Liste pushen muss, sondern gleich sortieren kann?
opendir(DIR,'users') or die "....
while (defined($_ = readdir(DIR))) {
if ($_ =~ /^\d+?.cgi$/) {
push @liste, $_;
}
}
closedir DIR;
.
.
.
$xNeTworKx.
Moin Moin !
my $dir='/path/to/users'; # absolut bitte, im CGI!
opendir DIR,$dir or die "opendir '$dir': $!";
my @list=sort { -M("$dir/$a") <=> -M("$dir/$b") } readdir DIR;
closedir DIR;
Erweitert mit einigen Filtern, so daß nur noch Dateien mit dem Muster *.cgi gesucht werden:
my $dir='/path/to/users'; # absolut bitte, im CGI!
opendir DIR,$dir or die "opendir '$dir': $!";
my @list=sort { -M("$dir/$a") <=> -M("$dir/$b") } grep { /.cgi$/ and -f "$dir/$_" } readdir DIR;
closedir DIR;
Was da genau passiert, findest Du in der Perl-Doku. ;-)
Kann man die Files überhaupt schon während des Einlesens sortieren? Ich frage mich das deshalb, weil das Script ja noch nicht weis, welche Dateien noch kommen. Allerdings verstehe ich zu wenig von perlinternen Prozessen.
Wie könnte ich folgendes Beispiel so ändern, dass ich es nicht in eine Liste pushen muss, sondern gleich sortieren kann?
Du kannst natürlich auch selbst einen Bubblesort o.ä. implementieren. Der Algorithmus muß darauf optimiert sein, einen einzelnen Wert in eine bereits sortierte Liste einzubauen.
Alexander
Hallo,
opendir DIR,$dir or die "opendir '$dir': $!";
my @list=sort { -M("$dir/$a") <=> -M("$dir/$b") } grep { /.cgi$/ and -f "$dir/$_" } readdir DIR;
closedir DIR;
ja sowas gefällt mir :) Werd das gleich mal ausprobieren. Danke.
$xNeTworKx.
hi!
Du kannst natürlich auch selbst einen Bubblesort o.ä.
implementieren. Der Algorithmus muß darauf optimiert sein, einen
einzelnen Wert in eine bereits sortierte Liste einzubauen.
Wie kommst du auf Bubblesort? Das Prinzip, ein Element in eine schon
sortierte Liste einzusortieren, klingt mir sehr nach Insertionsort.
bye, Frank!