[Perl] "Unitialized value" avec Open (HA

Résolu/Fermé
Panurge
Messages postés
37
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
25 mars 2009
- 11 févr. 2006 à 17:45
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
- 11 févr. 2006 à 21:14
Bonsoir.

J'utilise Perl sous Windows XP.

Le script Perl qui suit provoque l'avertissement indiqué si l'ouverture du fichier (en lecture) ne réussit pas et seulement dans ce cas.
Quelqu'un peut-il me dire pourquoi ?

A part cela, tout me semble normal, mais je souhaite poser la question, parce qu'on m'a conseillé de corriger tout ce qui provoque des avertissements.
Par parenthèse, quelqu'un pourrait-il me dire comment on pourrait éviter cet avertissement ?


#!/usr/local/bin/perl -w # Sous Unix, sert à recevoir des avertissements.
# Je ne sais pas si cela sert sous Windows.

use strict;


# Le programme qui suit affiche l'avertissement "Use of uninitialized value in numeric eq (==) at OpenAvecValeurNonInitialisee.pl line 9.", mais uniquement si l'ouverture du fichier ne réussit pas. Dans les deux cas (que l'ouverture réussisse ou non), le résultat du programme est conforme aux attentes. Pourquoi cet avertissement, et pourquoi seulement dans un cas ?

if (open(FICHIERIN, "C:\\FichierFantome") == 0)
{
print "Fichier inexistant.";
}
else
{
close(FICHIERIN);
print "Le fichier existe."
}


Merci d'avance.

6 réponses

lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
11 févr. 2006 à 19:29
Tu veux afficher ton code s'il te plaît.

if (open(FICHIERIN, "C:\\FichierFantome") == 0) 

La fonction open renvoie vrai si elle réussit et undef sinon.

Donc dans ton cas tu peux écrire
unless (open FICHIERIN, "C:\FichierFantome") {
  print "Fichier inexistant.";
}
else
{
  close FICHIERIN;
  print "Le fichier existe."
} 


En revanche c'est mieux d'écrire quelque chose comme ça
open FIC, "C:\le_fichier.txt"
                 or die "Impossible d'ouvrir le fichier : $!\n";
# fermeture de prog si le fichier n'est pas accessible.
# traitement de fichier
while ( <FIC> ) { print }
close FIC;


En ce qui concerne l'option -w elle fonctionne aussi sous les OS non Linux
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
11 févr. 2006 à 19:41
De toute façon les avertissements nous disent qu'il y a quelque chose qui ne vas pas.
C'est pour ça que j'aimerai bien voir ton code.

Par exemple le pragma use strict installe 3 restrictions

use strict "vars" - les variables doivent être prédéclarées
use strict "refs" - les références symboliques sont interdites
use strict "subs" - les chaînes brutes doivent être entre guillemets

donc

use strict; # installe toutes les restrictions

no strict "vars"; # rennonce à la restriction concernant les ref symboliques

Pour les messages d'avertissement on peut utiliser

use warnings;

qui permet un contrôle plus souple que l'option -w
0
Panurge
Messages postés
37
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
25 mars 2009
3
11 févr. 2006 à 20:25
Merci beaucoup.

J'ai remplacé le if litigieux par

if (! defined (open(FICHIERIN, "C:\\Perl\\MesProgrPerl\\Debug.pl")) )

et maintenant, il n'y a plus d'avertissement (et le résultat est conforme aux attentes).

Curieusement, même quand j'avais écrit le if comme si undef était la même chose que la valeur nulle, le résultat était aussi conforme aux attentes, à l'avertissement près.

Donc l'avertissement provenait sûrement de ce que vous avez diagnostiqué.

Je n'aurais pas d'objection à vous montrer le code réel qui a provoqué l'avertissement, mais puisque mes nouveaux essais montrent que le problème était bien celui que vous avez vu, c'est peut-être inutile.

Cette instruction fait partie d'une longue routine qui fait intervenir Perl Tk et de nombreuses routines définies par moi.

Mais je répète que je n'ai pas d'objections à l'afficher si vous me dites que vous trouvez vraiment que cela en vaut la peine.

Vous pourrez me dire s'il y a d'autres " mauvaises pratiques "...

En tout cas, grand merci.
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
11 févr. 2006 à 20:40
Re,

la condition d'une structure if doit être une valeur booléene que Perl ne possède pas ( il n'a pas besoin ).

Voilà quelque règles simple pour comprendre comment Perl decide si une valeur et vraie ou fausse ( true ou false )

1. la valeur undef et toujours fausse

2. Zéro est faux

3. la chaîne vide est fausse

4. la chaîne '0' est fausse

5. une référence est toujours vraie

En bref undef,0,'0' et ' ' sont valeur fausse.

En ce qui concerne undef, quand on utilise ce "rien" ( mieux que nulle ) comme quelque chose numérique il vaut 0 et comme une chaîne il vaut la chaîne vide.
0
Panurge
Messages postés
37
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
25 mars 2009
3
11 févr. 2006 à 20:56
Remerci.

En somme, avec mon " open(...) == 0 ", j'utilisais la valeur indéfinie dans un contexte scalaire numérique, donc elle était assimilée à zéro, et il est donc normal que mon programme donnait le résultat attendu.

Mais bon, ce n'est sans doute pas une très bonne pratique, puisque ça provoquait un avertissement.

D'après ce que vous me dites, je pourrais sans doute écrire " if (open( FICHIERIN, "C\\LeFichier"))

ceci signifiant le cas de réussite.

Je crois quand même que je vais garder la formule avec "defined", qui a l'avantage de rappeler que open renvoie une valeur indéfinie en cas d'échec.

Je vais remplacer mes "if (open(...) == 0) dans tous mes programmes. Comme jusqu'ici, les ouvertures de fichiers réussissaient toujours, je n'avais jamais eu d'avertissement...

Encore un grand merci.
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565 > Panurge
Messages postés
37
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
25 mars 2009

11 févr. 2006 à 20:59
D'après ce que vous me dites, je pourrais sans doute écrire " if (open( FICHIERIN, "C\\LeFichier"))

ceci signifiant le cas de réussite.


Oui, tout à fait.

En ce qui concerne la variante aved defined elle est bonne aussi. Tu peux utiliser ce que tu veux tant que ça marche.

TMTOWTDI
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
11 févr. 2006 à 20:55
Re,

concernant ton code je n'ai pas besoin si ton problème est résolu.

Vous pourrez me dire s'il y a d'autres " mauvaises pratiques "...
Je ne sais pas les pratiques que tu utilises si je ne vois pas ton code.

Paradoxal, mais c'est perlien.

Je ne sais pas si tu connais ce site. http://www.perl-gratuit.com/traduction/index.html
Tu trouveras plein des choses dédans.

Bonne soirée.
0
Panurge
Messages postés
37
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
25 mars 2009
3
11 févr. 2006 à 21:04
" Je ne sais pas les pratiques que tu utilises si je ne vois pas ton code. "

Je sous-entendais " Si tu me dis être encore intéressé par mon code, je l'afficherai et tu pourras me dire s'il y a d'autres mauvaises pratiques. "

J'irai voir à l'adresse que tu indiques.

En tout cas, Commentcamarche n'a pas l'air d'une mauvaise adresse non plus, si j'en juge par le résultat de ma question...
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
11 févr. 2006 à 21:14
Commentcamarche n'a pas l'air d'une mauvaise adresse non plus

Je n'ai même pas pense que ccm est mauvais, si oui je n'étais pas là, seulement que sur le site que je t'ai donné tu as la documentation de Perl en français.

En ce qui concerne les pratiques, l'experience et la pratique elle même t'apprendra plus que moi. A mon tour j'apprends tous les jours et j'essaie de corriger mes erreurs et mes mauvaises pratiques et mon français.
0