Flux rss
Collection CommentÇaMarche.net
Rechercher : dans
Par :

[Perl] "Unitialized value" avec Open (HA

Panurge, le samedi 11 février 2006 à 17:45:00 
 Signaler ce message aux modérateurs

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.

1

lami20j, le samedi 11 février 2006 à 19:29:16

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

Répondre à lami20j

2

lami20j, le samedi 11 février 2006 à 19:41:04

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

Répondre à lami20j

3

Panurge, le samedi 11 février 2006 à 20:25:51

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.

Répondre à Panurge

4

lami20j, le samedi 11 février 2006 à 20:40:47

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.

Répondre à lami20j

6

Panurge, le samedi 11 février 2006 à 20:56:17

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.

Répondre à Panurge

7

lami20j, le samedi 11 février 2006 à 20:59:51

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

Répondre à lami20j

5

lami20j, le samedi 11 février 2006 à 20:55:53

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.

Répondre à lami20j

8

Panurge, le samedi 11 février 2006 à 21:04:53

" 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...

Répondre à Panurge

9

 lami20j, le samedi 11 février 2006 à 21:14:01

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.

Répondre à lami20j
[PERL] Ecrire dans un fichier (Résolu) Bonjour tout le monde, je programme en perl et j'ai besoin de modifier des paramètres dans un fichier automatiquement. voici un extrait du fichier : n 108 m 56 s 2 t 4 a 1 2 1 j'ai besoin d'accéder aux lignes 3 et 4 et de changer 2 et 4 par d'autres... www.commentcamarche.net/forum/affich-1524434-perl-ecrire-dans-un-fichier
[PERL] comparaison de chaines (Résolu) Bonjour a tous!! voila je voudrait comparer une 2 chaines les 2 chaines sont récupérées a partir de 2 documents textes voici un aperçu de mon code : #!C:\\Perl\\bin\\perl use strict; open (IN, "test.txt") || die "Impossible d'ouvrir le fichier pour... www.commentcamarche.net/forum/affich-3122349-perl-comparaison-de-chaines
[perl] Use of uninitialized value Bonjour, Bonjour, Je débute en perl, et j'essaye d'utiliser un script afin d'obtenir des rapport mensuels de nagios. J'ai recupéré ce script sur nagiosexchange. Quand je le compile, il me retourne les erreurs: Use of uninitialized value in print at... www.commentcamarche.net/forum/affich-7415845-perl-use-of-uninitialized-value
Silex - Flash CMS open source (et gratuit)SILEX ou SILEX-RIA est un logiciel RIA open source et gratuit qui permet de produire des sites en Flash (Flash Player 7, 8 et 9). Silex en deux mots Caractéristiques Ressources en Français Spécificité Liens avec d'autres... www.commentcamarche.net/faq/sujet-16649-silex-flash-cms-open-source-et-gratuit
[mythe] Logiciel libre = Logiciel Open sourceMythe Un logiciel libre est la même chose qu'un logiciel open-source Réalité FAUX Explications Ces deux catégories de logiciels sont souvent confondues, mais il y une légère différence. Logiciels libres Fondamentalement, un logiciel libre vous... www.commentcamarche.net/faq/sujet-4626-mythe-logiciel-libre-logiciel-open-source
Perl STDOUT redirection et retour au défaut.Bonjour, Actuellement je tente de contrôler le "Output" des print de mon programme perl (5.8). Je fais plusieurs open et open2 (vers d'autre programmes) je veux que certaines de mes sorties de retour(print ou printf) aillent dans un fichier et... www.commentcamarche.net/forum/affich-4153721-perl-stdout-redirection-et-retour-au-defaut
Script IF en Perl (Résolu)Bonjour les amis! =) Voilà, je travaille ma syntaxe if en PERL, et j'ai un petit problème que je ne parviens pas à résoudre... Je vous narre cela. Dans le script suivant, même si ma condition est respectée, le script passe toujours à else... Voici le... www.commentcamarche.net/forum/affich-11305989-script-if-en-perl
Perl: Extraction de données d'un fichier textHello ! Grâce à vous tous et aux tutoriels sur internet, j'ai réussi à faire tourner sous Unix mes premiers programmes perl. Il y a cependant quelque chose que je ne parviens pas à faire: Comment on extrait des données d'un fichier texte ? Je... www.commentcamarche.net/forum/affich-2165682-perl-extraction-de-donnees-d-un-fichier-text
Télécharger Open WorkbenchOpen Workbench est une application libre de gestion et de planification de projet. Il s'agit d'un équivalent libre de Microsoft Project possédant une interface simple et de nombreuses fonctionnalités. Il permet de définir le cycle de vie d'un... www.commentcamarche.net/telecharger/telecharger-34055146-open-workbench
Télécharger Open ContactsOpen Contacts est un carnet d'adresse avancé qui vous permettra de gérer les informations concernant vos contacts ou vos relations personnelles. Vous aurez la possibilité de personnaliser de façon transparente les informations qui peuvent être... www.commentcamarche.net/telecharger/telecharger-34057607-open-contacts
Perl - Les fichiersLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles... www.commentcamarche.net/contents/perl/perlfich.php3
Les variables avec PerlConcept de variable avec Perl Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Perl peuvent être de trois... www.commentcamarche.net/contents/perl/perlvar.php3
Perl - Caractéristiques du langageFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa... www.commentcamarche.net/contents/perl/perlcarac.php3