
Envoyé par
Splug
Dans le cas le plus contraignant, le script appelle cette fonction qui renvoit une liste enorme, et ceci est remarquablement long...
Je pense qu'utiliser les outils que je t'ai indiqué devrait aider pour cette partie.
Bon... je sais que ça peut ne pas paraître très clair,mais j'espere que ça précise assez ce dont j'ai besoin...
En fait tu as l'air d'avoir besoin de quelque chose d'assez polyvalent, donc utilisant un callback comme File::Find... Ca t'éviterais de toujours renvoyer une grosse liste, tu peux passer un callback qui construit directement le hash (tu comprends comment faire ça ?). Et tu peux toujours faire une fonction de listage compatible avec l'ancienne avec :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| use File::Find;
use File::Spec;
sub list {
my ($path, $recursive) = @_;
$path = File::Spec->rel2abs( $path );
my @files;
if( $recursive ) {
find( { wanted => sub { push @files, $File::Find::name },
no_chdir => 1 }, $path );
} else {
opendir my($dir), $path;
@files = map { File::Spec->catfile( $path, $_ ) } (grep m/^\.\.?$/, readdir $dir);
closedir $dir;
}
return @files;
} |
(NB : Tu prétend que ta fonction `dir /b /a:-D "$rep"` renvoie les chemins absolus mais chez moi ce n'est pas le cas, j'ai tout de même fait ma fonction de façon qu'elle respecte cette contrainte)
Pour conclure, j'utiliserai File::Find pour la liste des fichiers/dossiers récursif, mais y a t il un moyen de l'utiliser non récursivement (juste le contenu du dossier en argument?).
Non, mais ce n'est pas nécessaire, la série des fonctions *dir() marche très bien.
Pourquoi utiliser File::Spec->rel2abs() alors que File:Find:name renvoit deja un chemin absolu?
Ce n'est pas le cas, teste toi-même :
perl -MFile::Find -e "find( sub { print $File::Find::name, qq(\n) }, '.')"
--
Jedaï
Partager