Nouvelle question de la FAQ sur le débogage en Perl: A quoi sert le pragma "use strict;" ?
____________
Le pragma use strict; interdit certaines constructions syntaxiques jugées dangereuses: le compilateur échoue lorsqu'il rencontre ce genre de constructions (le programme ne peut même pas être lancé).
Il est presque toujours utile d'interdire ces constructions dangereuses, si bien qu'il est fortement recommandé de toujours mettre ce pragma en tête de tous vos programmes (sauf éventuellement pour les scripts unilignes).
Il y a trois types de constructions rendues interdites par l'utilisation du pragma use strict;: celles relatives aux variables ('vars'), aux fonctions ('subs') et aux références ('refs'). Il est possible d'interdire ces types constructions de façon individuelle et d'en autoriser d'autres. Par exemple si l'on désire interdire seulement les constructions relatives aux fonctions, on utilisera le pragma use strict 'subs';. Lorsque l'on utilise seulement use strict;, on interdit les trois types de constructions sans distinction. Donc:
est équivalent à:
Code : Sélectionner tout - Visualiser dans une fenêtre à part use strict;
Dans la très grande majorité des cas, on utilisera simplement use strict;, parce que l'on désire généralement interdire les trois types de constructions. A condition d'avoir une très bonne raison de le faire (et de très bien savoir ce que l'on fait), il est possible de désactiver temporairement l'une de ces interdictions, en utilisant par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 use strict "vars"; use strict "refs"; use strict "subs";
Désactiver ainsi l'une des interdictions permet dans certains cas de faire des constructions "magiques", mais ce n'est pas recommandé en-dehors de cas exceptionnels, et il y a presque toujours moyen de faire autrement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 use strict; # en début de programme # ... du code Perl no strict "refs"; # une ou deux lignes de code utilisant des références symboliques use strict "refs";
- strict "vars" : interdit les variables qui n'ont pas été déclarées (avec les fonctions my, our ou state) avant d'être utilisées):
Comme on le voit sur le dernier exemple, use strict 'vars'; permet notamment de détecter d'éventuelles erreurs (assez fréquentes) sur le nom des variables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 use strict "vars"; my $toto = 5; # OK, à cause de my our $titi = "titi"; # OK à cause de our $tutu = "tutu"; # ne marche pas parce que $tutu n'a pas été déclaré $MonPackage::i = 1 # OK, parce que le nom de la variable est donné en entier # avec le paquetage auquel elle appartient my @tableau = 1..10; my $compte_elements = scalar @tableau; # compte les éléments de @tableau print "$compte_element \n"; # erreur de compilation: erreur sur le nom de la variable
Les variables spéciales $a et $b utilisées par la fonction sort sont exemptées de cette obligation de déclaration préalable.
- strict "refs" : interdit l'utilisation (volontaire ou non) des références symboliques (qui étaient utiles en Perl 4, mais n'ont plus de raison d'être employées avec les références "dures" et les structures de données complexes de Perl 5):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 use strict "refs"; my $toto = 10; $ref = \$toto; print $$ref; # ok, imprime le contenu de $toto, donc 10 our $titi = 20; $ref = "titi"; print $$ref; # erreur à l'exécution car c'est une référence symbolique. # Imprimerait le contenu de $titi, donc 20, sans le strict vars
- strict "subs" : interdit l'utilisation de mots nus (barewords) pour les identifiants autres que les identifiants des fonctions (les mots nus restent toutefois autorisés pour les clefs des hachages s'ils sont encadrés par des { et }, ou à gauche de la "virgule grasse" =>) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 use strict "subs"; my %mois = (un => "janvier", deux = "février"); # OK $mois{trois} = mars; # erreur: mars est un mot nu $mois{quatre} = "avril"; # OK, en raison des guillemets autour d'avril
Partager