[Perl] Que faire contre ce « warning » ?

Yon anaseto at bardinflor.perso.aquilenet.fr
Sam 14 Jan 12:40:56 CET 2017


On Sat, Jan 14, 2017 at 12:18:22PM +0100, Dominique Asselineau wrote:
> > Si tu rajoutes:
> > 
> >     use diagnostics;
> > 
> > au début du fichier, tu obtiens plus de détails :
> > 
> >     (W misc) In a conditional expression, you used <HANDLE>, <*> (glob),
> >     each(), or readdir() as a boolean value.  Each of these constructs
> >     can return a value of "0"; that would make the conditional expression
> >     false, which is probably not what you intended.  When using these
> >     constructs in conditional expressions, test their values with the
> >     defined operator.
> > 
> > C'est-à-dire, que perl te prévient que $l = <$src> peut être risqué, car si
> > $src est la chaîne "0", ça va être false, et ce n'est probablement pas ce que
> > tu voudrais dans ce cas
> 
> Ok mais dans ce cas, pourquoi n'y a-t-il pas de warning lorsqu'on met seulement
> 
> while( $l = <$src> ) { ... }
> 
> Dans le while, on a bien à faire à une condition ?
Comme l'a mentionné Laurent, perl fait un cas particulier et rajoute
automatiquement un defined. Dès que la condition est plus compliquée
qu'un $l = <$src>, il ne le rajoute plus automatiquement et lance un
warning. Dans le cas où on voudrait vraiment que ce soit traité comme un
booléen, il faudrait écrire while(($l = <$src>) ne '0').

Dans while(<>) le defined implicite est aussi ajouté. La liste des cas
spéciaux est donnée dans perldoc -f '<>'.

-- 
Yon


Plus d'informations sur la liste de diffusion Perl