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

readdir, -M et chdir

3 réponses
Avatar
Eric C.
Bonjour =E0 tous,

J'essaie de lire les informations retourn=E9es par l'op=E9rateur -M, =E0 la
fois dans le r=E9pertoire d'o=F9 est lanc=E9 mon script ainsi que dans un
sous-r=E9pertoire. J'obtiens cependant un comportement un peu
=E9trange ...
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=3Dreaddir(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=E9rateur -M ne fonctionne plus sur le
fichier def.txt du sous-r=E9pertoire (qui est cependant bien lu), et la
date affect=E9e =E0 .. est celle de la racine (donc du .. du r=E9pertoire d=
e
lancement, et non du sous-r=E9pertoire) :

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=E9pertoire, 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 =E9crite
(je vois bien la tabulation si je redirige sur un fichier)

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


Eric

3 réponses

Avatar
Eric C.
On 15 juin, 15:38, "Eric C." wrote:
[...]
Mais la position du prompt montre bien




... du moins sur ma console, Google groupes ayant mangé les retours à
la ligne successifs ...


qu'une ligne vide est écrite



... (sous-entendu) à chaque itération de while



Eric
Avatar
Paul Gaborit
À (at) Tue, 15 Jun 2010 06:38:14 -0700 (PDT),
"Eric C." écrivait (wrote):

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



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/&gt;
Perl en français - <http://perl.mines-albi.fr/&gt;
Avatar
Eric C.
On 15 juin, 23:26, Paul Gaborit wrote:

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"




Mieux vaut tard que jamais : merci !


Eric