[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
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
A voir également:
- [Perl] "Unitialized value" avec Open (HA
- Open office francais - Télécharger - Suite bureautique
- Open core legacy patcher - Accueil - MacOS
- Open sankoré - Télécharger - Bureautique
- Texte open document - Guide
- Denon perl pro test - Accueil - Audio
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 569
11 févr. 2006 à 19:29
11 févr. 2006 à 19:29
Tu veux afficher ton code s'il te plaît.
La fonction open renvoie vrai si elle réussit et undef sinon.
Donc dans ton cas tu peux écrire
En revanche c'est mieux d'écrire quelque chose comme ça
En ce qui concerne l'option -w elle fonctionne aussi sous les OS non Linux
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
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 569
11 févr. 2006 à 19:41
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
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
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
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.
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.
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 569
11 févr. 2006 à 20:40
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.
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.
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
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.
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.
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 569
>
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
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
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
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 569
11 févr. 2006 à 20:55
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.
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.
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
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...
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...
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 569
11 févr. 2006 à 21:14
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.
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.