[Toulouse-pm] strict

Michel Rodriguez mirod at xmltwig.com
Sat Jul 5 08:22:00 CDT 2003


On Sat, 5 Jul 2003, Eric Vernichon wrote:

>    Une petite question sans doute stupide mais bon.
>
>     Pourquoi lorsque j'écris
>
>         my @lettres =A..Z;
>         foreach $lettre (@lettres)
>      	{
>           	print $lettre;
>      	}
>
>     et que j'utilise use strict j'ai comme message
> Bareword "Z" not allowed while "strict subs" in use at  ...
> Bareword "A" not allowed while "strict subs" in use at ...
>
> alors que si je vire le use strict ça marche.

Le pourquoi: c'est a ca que sert strict! Ca verifie que toutes les
variables sont bien declarees (strict 'vars'), ca empeche les references
foireuses (strict 'refs') et ca detecte les mots isoles qui ne sont pas
des fonctions (strict 'subs'):

strict subs

    This disables the poetry optimization, generating a compile-time error
if you try to use a bareword identifier that's not a subroutine, unless it
appears in curly braces or on the left hand side of the "=>" symbol.

(tire de http://www.perldoc.com/perl5.6.1/lib/strict.html)

Sans 'use strict;' les mots isoles sont pris comme des chaines de
caractere:

perl -le'$s= toto; print $s'

note que si tu fait perl -le'print toto' ca foire parce que
(je pense) l'interpreteur ne sait pas si toto est un filehandle ou une
chaine de caractere.

C'est rigolo d'experimenter un peu:

perl -le'$s= toto . tata; print $s' # marche
perl -le'print toto . tata'         # marche
perl -le'print toto , tata'         # erreur
     No comma allowed after filehandle at -e line 1.
     l'interpreteur supose que toto est un filehandle
perl -le'print toto  tata'          # erreur
     Can't locate object method "toto" via package "tata" (perhaps you
     forgot to load "tata"?) at -e line 1.

Conclusion: il vaut mieux utiliser strict et mettre les chaines entre
guillemets!

Donc dans ton cas il faut ecrire:

#!/usr/bin/perl -w
use strict;

my @lettres ='A'..'Z';        # 'A' et 'Z' sont maintenant des  chaines
foreach my $lettre (@lettres) # note le 'my' qui declare lettre
 { print $lettre; }



Michel Rodriguez
Perl & XML
http://www.xmltwig.com




More information about the Toulouse-pm mailing list