readdir, -M et chdir

Le
Eric C.
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,"")};
print "";
opendir REP,"temp" or die "echec";
chdir "temp";
while ($fic=readdir(REP)) {
print $fic,"t",-M($fic),"";
}

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 d=
e
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,"")};
print "";
opendir REP,"temp" or die "echec";
chdir "temp";
while (readdir(REP)) {
print $_,"t",-M,"";
}

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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Eric C.
Le #22259531
On 15 juin, 15:38, "Eric C."
[...]
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
Paul Gaborit
Le #22261641
À (at) Tue, 15 Jun 2010 06:38:14 -0700 (PDT),
"Eric C."
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 - Perl en français -
Eric C.
Le #22290691
On 15 juin, 23:26, Paul Gaborit

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
Publicité
Poster une réponse
Anonyme