OVH Cloud OVH Cloud

[DEBUTANT] souci avec for

9 réponses
Avatar
Emmanuel
Bonjour à tous,

J'ai un petit souci, probablement pas bien méchant bien que titillant.
Voila mon bout de code :

for my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}

L'interpréteur me met un warning au niveau du "if" me stipulant que
"$dir" n'est pas initialisée... ce qui me semble tout à fait faux
puisque je n'ai pas de warning sur le 1er "print".

my(), tel que déclaré ci-dessus, ne fonctionne qu'au niveau local du
bloc "for", ai-je lu, mais il me parait abérrant que la variable ne soit
pas passée dans les sous-blocs. Y aurait-il de réaliser ça ?

Question subsidiaire: "if (-M DIRHANDLER > 1)" semble fonctionner avec
perl 5.6, mais pas avec perl 5.0. Est-ce le cas ?

D'avance merci,

Emmanuel

9 réponses

Avatar
mzi
Emmanuel wrote:


for my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}


Peut-être voulez-vous faire:

foreach my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}

?

--
mzi

Avatar
Emmanuel
Peut-être voulez-vous faire:

foreach my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}

?


Merci pour votre réponse.

J'obtiens malheureusement le même message d'erreur : Use of
uninitialized value at D:scriptsbackup.pl line 51.
Il me semble toutefois que "foreach" n'est qu'un synonyme de "for".

Emmanuel

Avatar
mzi
Emmanuel wrote:

foreach my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}



À mon avis, le problème est ailleurs: en exécutant seulement ce petit bout
de code (for ou foreach), il n'y a pas d'erreur.

Essayez toujours:

foreach my $dir (@dirContent)
{
next unless defined $dir;
print "$dir ";
print "$dir " if (-M $dir > 1);
}

Au cas où $dir pourrait être undef.


--
mzi


Avatar
Emmanuel
À mon avis, le problème est ailleurs: en exécutant seulement ce petit bout
de code (for ou foreach), il n'y a pas d'erreur.

Essayez toujours:

foreach my $dir (@dirContent)
{
next unless defined $dir;
print "$dir ";
print "$dir " if (-M $dir > 1);
}

Au cas où $dir pourrait être undef.




$dir est bien défini, mais seulement de le bloc 'strict' du "for".
L'interpréteur le voit comme "undef" dans le test du "if".

Même en ajoutant la ligne "next unless defined $dir" j'obtiens l'erreur.
Logique puisque au niveau de cette instruction, $dir semble être bel et
bien défini :/

Bizarre...

Merci de vous être penché sur mon problème en tout cas, si je trouve un
workaround, je le posterai

Emmanuel

Avatar
Rue des Prairies
Bonjour à tous,

J'ai un petit souci, probablement pas bien méchant bien que titillant.
Voila mon bout de code :

for my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}

L'interpréteur me met un warning au niveau du "if" me stipulant que
"$dir" n'est pas initialisée... ce qui me semble tout à fait faux
puisque je n'ai pas de warning sur le 1er "print".

my(), tel que déclaré ci-dessus, ne fonctionne qu'au niveau local du
bloc "for", ai-je lu, mais il me parait abérrant que la variable ne soit
pas passée dans les sous-blocs. Y aurait-il de réaliser ça ?

Question subsidiaire: "if (-M DIRHANDLER > 1)" semble fonctionner avec
perl 5.6, mais pas avec perl 5.0. Est-ce le cas ?

D'avance merci,

Emmanuel


Bonsoir,

Je pense que ta variable $dir ne contient pas un nom de fichier existant.
Ajoute :
next unless(-e $dir);
avant de faire ton test -M

Olivier.

Avatar
Patrick Mevzek
L'interpréteur me met un warning au niveau du "if" me stipulant que
"$dir" n'est pas initialisée... ce qui me semble tout à fait faux
puisque je n'ai pas de warning sur le 1er "print".


Le plus simple serait encore de donner le message d'erreur *exactement*
tel qu'affiché, sans re-interprétation.
En tout cas cela aiderait probablement à vous donner des pistes
pertinentes.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
Paul Gaborit
À (at) Tue, 08 Nov 2005 14:29:49 +0100,
Emmanuel écrivait (wrote):
Peut-être voulez-vous faire:
foreach my $dir (@dirContent)
{
print "$dir ";
print "$dir " if (-M $dir > 1);
}
?


Merci pour votre réponse.

J'obtiens malheureusement le même message d'erreur : Use of
uninitialized value at D:scriptsbackup.pl line 51.
Il me semble toutefois que "foreach" n'est qu'un synonyme de "for".


'for' et 'foreach' sont effectivement *totalement* équivalent (en
Perl).

Le message dit qu'*une* valeur non initialisée est utilisée. Il ne dit
pas que cette valeur est celle de $dir ! Si c'était celle de $dir,
l'erreur aurait été signalée aussi à la ligne précédente (qui utilise
aussi $dir). Donc ce n'est pas la valeur de $dir. Quelle autre valeur
alors ? Le résultat de '-M $dir'.

$dir n'est donc pas un chemin valide (ou vous n'avez pas le droit
d'accéder à ces informations).

Peut-être avez-vous oublié de prefixer le nom $dir par le chemin
d'accès global... Un truc du genre :

...
print $dir if -M "$dirglob/$dir" > 1;
...

où $dirglob est le chemin d'accès au répertoire ayant servi à faire le
tableau @dirContent.

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


Avatar
Emmanuel
'for' et 'foreach' sont effectivement *totalement* équivalent (en
Perl).

Le message dit qu'*une* valeur non initialisée est utilisée. Il ne dit
pas que cette valeur est celle de $dir ! Si c'était celle de $dir,
l'erreur aurait été signalée aussi à la ligne précédente (qui utilise
aussi $dir). Donc ce n'est pas la valeur de $dir. Quelle autre valeur
alors ? Le résultat de '-M $dir'.

$dir n'est donc pas un chemin valide (ou vous n'avez pas le droit
d'accéder à ces informations).

Peut-être avez-vous oublié de prefixer le nom $dir par le chemin
d'accès global... Un truc du genre :

...
print $dir if -M "$dirglob/$dir" > 1;
...

où $dirglob est le chemin d'accès au répertoire ayant servi à faire le
tableau @dirContent.



Mais que je suis con... C'est exactement ça ! Avant de blamer le
langage, j'aurais dû réflechir plus...

Merci à tous pour vos réponses en tout cas :)

Emmanuel

Avatar
Paul Gaborit
À (at) Wed, 09 Nov 2005 09:35:16 +0100,
Emmanuel écrivait (wrote):
Mais que je suis con...


Allons, allons... Ça arrive à tout le monde ;-)

C'est exactement ça ! Avant de blamer le langage, j'aurais dû
réflechir plus...


C'est sûr : c'est une conséquence de ce qui précède ;-)

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