web-dev-qa-db-fra.com

Comment puis-je parcourir des fichiers dans un répertoire en Perl?

Duplicata possible:
Comment puis-je lister tous les fichiers d'un répertoire avec Perl?

Je veux parcourir quelques centaines de fichiers qui sont tous contenus dans le même répertoire. Comment pourrais-je faire cela en Perl?

27
adhanlon
#!/usr/bin/Perl -w

my @files = <*>;
foreach my $file (@files) {
  print $file . "\n";
}

 @files = <*>;

peut être

 @files = </var/www/htdocs/*>;
 @files = </var/www/htdocs/*.html>;

etc.

48
EToreo

Prendre plaisir.

opendir(DH, "directory");
my @files = readdir(DH);
closedir(DH);

foreach my $file (@files)
{
    # skip . and ..
    next if($file =~ /^\.$/);
    next if($file =~ /^\.\.$/);

    # $file is the file used on this iteration of the loop
}
19
skarface

Vous pouvez utiliser readdir ou glob .

Ou, vous pouvez utiliser un module tel que Path :: Class :

Normalement, children() n'inclura pas les entrées self et parent. et .. (ou leurs équivalents sur les systèmes non-Unix), parce que c'est comme si j'étais mon propre grand-père. Si vous voulez toutes les entrées du répertoire, y compris celles-ci, transmettez une valeur vraie pour le paramètre all:

@c = $dir->children(); # Just the children
@c = $dir->children(all => 1); # All entries

De plus, il y a un paramètre no_hidden qui exclura toutes les entrées normalement "cachées" - sur Unix cela signifie exclure toutes les entrées qui commencent par un point (.):

@c = $dir->children(no_hidden => 1); # Just normally-visible entries

Ou, Path :: Tiny :

@paths = path("/tmp")->children;
@paths = path("/tmp")->children( qr/\.txt$/ );

Renvoie une liste de Path::Tiny objets pour tous les fichiers et répertoires d'un répertoire. Exclut "." et ".." automatiquement.

Si une option qr// L'argument est fourni, il ne renvoie que les objets pour les noms d'enfants qui correspondent à l'expression régulière donnée. Seul le nom de base est utilisé pour la correspondance:

@paths = path("/tmp")->children( qr/^foo/ );
# matches children like the glob foo*

Obtenir la liste des entrées de répertoire dans un tableau gaspille de la mémoire (par opposition à obtenir un nom de fichier à la fois), mais avec seulement quelques centaines de fichiers, il est peu probable que ce soit un problème.

Path::Class est portable sur les systèmes d'exploitation autres que * nix et Windows. D'un autre côté, AFAIK, ses instances utilisent plus de mémoire que Path::Tiny instances.

Si la mémoire est un problème, il vaut mieux utiliser readdir dans une boucle while.

13
Sinan Ünür