[Perl] Que faire contre ce « warning » ?

Laurent Rosenfeld laurent.rosenfeld at googlemail.com
Sam 14 Jan 11:52:07 CET 2017


Bonjour,

si la condition d'un

while ($l = <fh>) { ...

est simple, Perl ajoute un defined implicite et la transforme en un:

while(defined ($l = <fh>)) {

ce qui te prémunit contre un bug probable si la ligne contient un 0 seul
(sans doute en fin de fichier) entraînant une condition fausse pour le
while et, donc, l'arrêt prématuré de la boucle.

Si la condition du while est plus complexe, Perl n'ajoute pas ce
defined implicite,
et donc le bug d'une ligne contenant un zéro peut de nouveau se produire.
Je pense que le warning rencontré te prévient de ce bug possible.

Compare ceci:

$ perl -MO=Deparse -e 'while( ($l = <$src>) && ($l !~ m/,1,/) ) {next;}'
while ($l = <$src> and not $l =~ /,1,/) {
    next;
}
-e syntax OK

avec ceci:

$ perl -MO=Deparse -e 'while( $l = <$src>) {next;}'
while (defined($l = <$src>)) {
    next;
}
-e syntax OK

Je pense que tu peux éliminer le warning (et le risque de bug) en ajoutant
toi-même le defined:

while (defined ($l = <$src>) and not $l =~ /,1,/) {

Cordialement,
Laurent.

Le 14 janvier 2017 à 10:06, Philippe Delavalade <
philippe.delavalade at orange.fr> a écrit :

> Bonjour la liste.
>
> Voici un petit ECM qui produit le warning suivant :
>
> Value of <HANDLE> construct can be "0"; test with defined() at ./truc.pl
> line 11.
>
> \begin{script}
> #!/usr/bin/perl -w
>
> use Modern::Perl;
>
> my $src;
> my $l;
>
> open( $src, "<", "fichier" )
>   || die "\nImpossible d'ouvrir fichier\n";
>
> while( ($l = <$src>) && ($l !~ m/,1,/) ) {next;}
>
> close $src;
>
> exit 0;
> \end{script}
>
> À part cela, le script fait son boulot.
>
> Je ne comprends pas d'où vient le problème ni comment le résoudre en
> testant avec un defined().
>
> On peut contourner le problème en mettant la seconde condition dans le
> while avec par example
> while($l = <$src<) {last if($l =~ m/,1,/);}
>
> Mais ça n'explique pas la présence de l'avertissement.
>
> Merci de vos lumières.
>
> --
> Ph. Delavalade
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
>
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/mailman/private/perl/attachments/20170114/f23c79a1/attachment.html>


Plus d'informations sur la liste de diffusion Perl