Discussion:
readdir, -M et chdir
(trop ancien pour répondre)
Eric C.
2010-06-15 13:38:14 UTC
Permalink
Bonjour à tous,

J'essaie de lire les informations retournées par l'opérateur -M, à la
fois dans le répertoire d'où est lancé mon script ainsi que dans un
sous-répertoire. J'obtiens cependant un comportement un peu
étrange ...
La version qui me permet d'obtenir exactement ce que je veux est la
suivante :

foreach (<*>) {print ($_,"\t",-M,"\n")};
print "\n";
opendir REP,"temp" or die "echec";
chdir "temp";
while ($fic=readdir(REP)) {
print $fic,"\t",-M($fic),"\n";
}

J'obtiens alors :

C:\TESTS_PERL>perl test.pl
abc.txt 0.0112268518518519
temp 0.00266203703703704
test.pl 2.31481481481481e-005

. 0.00266203703703704
.. 0.0112731481481481
def.txt 0.00269675925925926


Si je retire le chdir, l'opérateur -M ne fonctionne plus sur le
fichier def.txt du sous-répertoire (qui est cependant bien lu), et la
date affectée à .. est celle de la racine (donc du .. du répertoire de
lancement, et non du sous-répertoire) :

C:\TESTS_PERL>perl test.pl
abc.txt 0.0110185185185185
temp 0.0024537037037037
test.pl 1.15740740740741e-005

. 0.0110648148148148
.. 11123.5889930556
def.txt

Et enfin si je garde le chdir mais que je m'abstiens d'affecter une
variable lors du while de lecture du sous-répertoire, avec un code
comme celui-ci :
foreach (<*>) {print ($_,"\t",-M,"\n")};
print "\n";
opendir REP,"temp" or die "echec";
chdir "temp";
while (readdir(REP)) {
print $_,"\t",-M,"\n";
}

L'affichage du nom de fichier et de sa date ne donnent rien :

C:\TESTS_PERL>perl test.pl
abc.txt 0.0273611111111111
temp 0.0187962962962963
test.pl 1.15740740740741e-005





C:\TESTS_PERL>

Mais la position du prompt montre bien qu'une ligne vide est écrite
(je vois bien la tabulation si je redirige sur un fichier)

Si quelqu'un a des explications, je suis preneur ...


Eric
Eric C.
2010-06-15 14:01:13 UTC
Permalink
Post by Eric C.
[...]
Mais la position du prompt montre bien
... du moins sur ma console, Google groupes ayant mangé les retours à
la ligne successifs ...
Post by Eric C.
qu'une ligne vide est écrite
... (sous-entendu) à chaque itération de while



Eric
Paul Gaborit
2010-06-15 21:26:17 UTC
Permalink
À (at) Tue, 15 Jun 2010 06:38:14 -0700 (PDT),
Post by Eric C.
La version qui me permet d'obtenir exactement ce que je veux est la
foreach (<*>) {print ($_,"\t",-M,"\n")};
print "\n";
opendir REP,"temp" or die "echec";
chdir "temp";
while ($fic=readdir(REP)) {
print $fic,"\t",-M($fic),"\n";
}
C:\TESTS_PERL>perl test.pl
abc.txt 0.0112268518518519
temp 0.00266203703703704
test.pl 2.31481481481481e-005
. 0.00266203703703704
.. 0.0112731481481481
def.txt 0.00269675925925926
Si je retire le chdir, l'opérateur -M ne fonctionne plus sur le
fichier def.txt du sous-répertoire (qui est cependant bien lu), et la
date affectée à .. est celle de la racine (donc du .. du répertoire de
C:\TESTS_PERL>perl test.pl
abc.txt 0.0110185185185185
temp 0.0024537037037037
test.pl 1.15740740740741e-005
. 0.0110648148148148
.. 11123.5889930556
def.txt
La réponse courte :

use warnings;

On ne devrait jamais poster une question sur un forum Perl sans l'avoir
utiliser ! ;-)

La réponse un peu plus longue : 'readdir' retourne le nom de chaque
fichier du répertoire lu et non son chemin d'accès. Pour tester les
fichiers du sous-répertoires avec -M (et sans faire appel à 'chdir'), il
faut utiliser :

-M "temp/$fic"
--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Eric C.
2010-06-23 16:34:19 UTC
Permalink
   use warnings;
On ne devrait jamais poster une question sur un forum Perl sans l'avoir
utiliser ! ;-)
La réponse un peu plus longue : 'readdir' retourne le nom de chaque
fichier du répertoire lu et non son chemin d'accès. Pour tester les
fichiers du sous-répertoires avec -M (et sans faire appel à 'chdir'), il
   -M "temp/$fic"
Mieux vaut tard que jamais : merci !


Eric

Loading...