Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

liste des fichiers *.aaa et *.bbb d'un repertoire specifie

14 réponses
Avatar
fun.x
Bonjour,

Je sais que ce genre de questions est assez basique, mais apres une
recherche sur les newsgroups, je n'arrive toujours pas a faire
exactement ce que je veux.

Voila, pour commencer, je desire recuperer la liste des fichiers *.aaa
et *.bbb d'un repertoire que je specifie en parametre. Evidemment, je
suis un debutant... :-)

J'ai essaye d'utiliser Glob mais ca ne marche pas des masses.

Merci pour votre aide.
Toute proposition d'optimisation est la bienvenue :-)


voila mon code:

use File::DosGlob;
use strict 'vars';

my $Argc=@ARGV;
if ($Argc != 1) {
printf ("USAGE: $0 <DIRECTORY>\n");
exit;
}

my $Dir = $ARGV[0];

#opendir(DIR, $Dir) or die("Error while openning directory $Dir\n");

my @list= glob("$Dir\\*.aaa $Dir\\*.bbb");

foreach (@list) {
printf("$_\n");
}

#closedir(DIR);

10 réponses

1 2
Avatar
damien guerin
Tu peux faire :
my @files=readdir($Dir);
my @filesFiltered=grep(/.*.aaa$|.*.bbb$/,@files);

voilii
Avatar
damien guerin
Histoire d'être sûr que tu comprennes, voici le code testé :

opendir(DIR, ".");
my @files=readdir(DIR);
my @filesFiltered=grep(/.*.aaa$|.*.bbb$/,@files);
print "res:"."@filesFiltered"."n";
close DIR;

Voilii
Avatar
fun.x
OK. Merci.

j'ai teste. ca tient aussi en une ligne:
opendir(DIR, $Dir);
my @filesFiltered=grep(/.*.aaa$|.*.bbb$/, readdir(DIR) );
print "res:"."@filesFiltered"."n";
close DIR;
Avatar
Nicolas George
"fun.x" wrote in message
:
j'ai teste. ca tient aussi en une ligne:
opendir(DIR, $Dir);
my @filesFiltered=grep(/.*.aaa$|.*.bbb$/, readdir(DIR) );
^

berk les noms de variables à la java.

print "res:"."@filesFiltered"."n";
close DIR;


On peut même économiser le close (qui d'ailleurs devrait être un closedir) :

my @files_filtered = do {
opendir my $d, $dir or die "$dir: $!n";
grep /.(?:aaa|bbb)Z/, readdir $d;
};

Je trouve cette manière de faire beaucoup plus élégante, avec la
lexicalisation de l'ouverture du répertoire.

Avatar
damien guerin
ça me fait rire ton "beurk, les noms de variables à la Java". Moi
perso, j'ai jamais vu des noms de variables à la sauce Java. Ca
ressemble à quoi pour toi, des noms de variables à la Perl? En tout
cas, je ne me doutais pas qu'il y avait une différence... ;)

Sinon, je ne vois pas ce que ça apporte d'utiliser do... Moi, je
trouve seulement que ça rend beaucoup moins lisible.
ça a le mérite au moins de croire qu'on est un killer...!

Enfin, ce n'est que mon avis...
Avatar
Paul Gaborit
À (at) 30 May 2005 04:57:17 -0700,
"damien guerin" écrivait (wrote):
ça me fait rire ton "beurk, les noms de variables à la Java". Moi
perso, j'ai jamais vu des noms de variables à la sauce Java. Ca
ressemble à quoi pour toi, des noms de variables à la Perl? En tout
cas, je ne me doutais pas qu'il y avait une différence... ;)


C'est une histoire de style. Chacun peut choisir celui qu'il veut mais doit
respecter le style général imposé par le langage et doit respecter le style
qu'il a choisi.

Perl propose (impose) quelques règles : les constantes en majuscules
(COMME_CA), les noms de classes (ou de modules) capitalisé (CommeCa), les
pragmas réservés au langage en minuscule (comme::ca), les handles en
majuscules (DIR, FH), les noms de méthodes en minuscules (comme_ca), etc.

Après, chacun son style...

Sinon, je ne vois pas ce que ça apporte d'utiliser do... Moi, je
trouve seulement que ça rend beaucoup moins lisible.
ça a le mérite au moins de croire qu'on est un killer...!


On peut faire sans le 'do'. Ce qui est intéressant, c'est l'usage d'un
scalaire ($d) qui est lexicalement local plutôt que d'un HANDLE (DIR) qui est,
par nature, global :

my @files_filtered;
{
opendir my $d, $dir or die "$dir: $!n";
@files_filtered = grep /.(?:aaa|bbb)Z/, readdir $d;
closedir $d; # pas indispensable...
}

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
damien guerin
ok... merci pour cette précision...!
Je suis ok, avec cette utilisation de scalaire. ;)

Bonne journée...
Avatar
fun.x
Hello,

une demande de precision supplementaire:
si je veux la liste de tous les fichiers *.aaa et *.bbb sauf le fichier
f1.aaa ?
(Je ne veux pas que le fichier f1.aaa apparaissent dans ma liste)

Comment completer la regexp en entree de grep ? avec un tag du genre
!f1.aaa ?

Merci
Marc
Avatar
Jogo
Le 31 mai 2005, fun.x a écrit dans fr.comp.lang.perl :

si je veux la liste de tous les fichiers *.aaa et *.bbb sauf le fichier
f1.aaa ?


Je ne crois pas que cela soit possible avec des regexps (ou alors des trucs
pas simples). Il vaut peut-être mieux boucler (pas testé) :

my @files_filtered;
{
opendir my $d, $dir or die "$dir: $!n";
while (readdir $d)
{ push @files_filtered, $_ if
(/.(?:aaa|bbb)Z/) && ($_ ne "f1.aaa")) ;
} ;
closedir $d; # pas indispensable...
}

Avatar
JacK
Le 31/05/2005 08:31, :
Hello,

une demande de precision supplementaire:
si je veux la liste de tous les fichiers *.aaa et *.bbb sauf le fichier
f1.aaa ?
(Je ne veux pas que le fichier f1.aaa apparaissent dans ma liste)

Comment completer la regexp en entree de grep ? avec un tag du genre
!f1.aaa ?

Merci
Marc

Rajouter:

Rajouter:
(?<!f1.aaa)
et lire la doc pour faire mieux.

JacK

1 2