Apparemment, use strict
devrait (doit) être utilisé lorsque vous voulez forcer perl à coder correctement, ce qui pourrait forcer la déclaration, être explicite sur les chaînes et les subs, c'est-à-dire les mots nus ou utiliser les refs avec prudence. Remarque: s'il y a des erreurs, use strict annulera l'exécution s'il est utilisé.
Bien que use warnings;
cela vous aidera à trouver des erreurs de frappe dans le programme, comme si vous avez manqué un point-virgule, vous avez utilisé «elseif» et non «elsif», vous utilisez une syntaxe ou une fonction obsolète, peu importe ce que vous voulez. Remarque: l'utilisation d'avertissements ne fournira que des avertissements et poursuivra l'exécution, c'est-à-dire n'interrompra pas l'exécution.
Quoi qu'il en soit, il vaudrait mieux entrer dans les détails, ce que je précise ci-dessous
De perl.com (mon préféré):
utilisez des 'vars' stricts;
ce qui signifie que vous devez toujours déclarer les variables avant de les utiliser.
Si vous ne déclarez pas, vous obtiendrez probablement un message d'erreur pour la variable non déclarée
Le symbole global "$ variablename" nécessite un nom de package explicite à la ligne 3 de scriptname.pl
Cet avertissement signifie que Perl n'est pas exactement clair sur la portée de la variable. Vous devez donc être explicite sur vos variables, ce qui signifie soit les déclarer avec my
pour qu'elles soient limitées au bloc courant, soit y faire référence avec leur nom complet (par exemple: $ MAIN :: variablename).
Ainsi, une erreur de compilation est déclenchée si vous tentez d'accéder à une variable qui ne répond pas à au moins l'un des critères suivants:
Prédéfini par Perl lui-même, tel que @ARGV,% ENV et toutes les variables de ponctuation globales telles que $. ou $ _.
Déclaré avec notre (pour un global) ou mon (pour un lexical).
Importé d'un autre package. (L'utilisation de vars pragma simule une importation, mais utilisez notre à la place.)
Complètement qualifié en utilisant son nom de package et le séparateur de package double-virgule.
utilisez des 'subs' stricts;
Considérez deux programmes
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
Dans les deux cas, nous avons un sous test_value () et nous voulons mettre son résultat dans $ a. Et pourtant, lorsque nous exécutons les deux programmes, nous obtenons deux résultats différents:
Dans le premier programme, au moment où nous en arrivons $a = test_value;
, Perl ne connaît aucun sous test_value (), et test_value est interprété comme une chaîne 'test_value'. Dans le deuxième programme, la définition de test_value () vient avant la $a = test_value;
ligne. Perl considère test_value comme un sous-appel.
Le terme technique pour des mots isolés comme test_value qui pourraient être des sous-titres et des chaînes en fonction du contexte, d'ailleurs, est bareword . La gestion des mots nus par Perl peut prêter à confusion et provoquer des bogues dans le programme.
Le bogue est ce que nous avons rencontré dans notre premier programme, rappelez-vous que Perl test_value()
n'attendra pas avec impatience de trouver , donc comme il n'a pas déjà vu test_value (), il suppose que vous voulez une chaîne. Donc, si vous use strict subs;
, cela provoquera la mort de ce programme avec une erreur:
Bareword "test_value" n'est pas autorisé lorsque "strict subs" est utilisé à ./a6-strictsubs.pl ligne 3.
La solution à cette erreur serait
1. Utilisez des parenthèses pour indiquer clairement que vous appelez un sous-marin. Si Perl voit $ a = test_value () ;,
2. Déclarez votre sous avant de l'utiliser pour la première fois
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3. Et si vous voulez l'utiliser comme une chaîne, citez-la.
Donc, cette restriction oblige Perl à traiter tous les barewords comme des erreurs de syntaxe. * Un mot nu est un nom nu ou un identifiant qui n'a aucune autre interprétation forcée par le contexte. (Le contexte est souvent forcé par un mot-clé ou un jeton à proximité, ou par la prédéclaration du mot en question.) * Donc, si vous voulez l'utiliser comme chaîne, citez-le et si vous voulez l'utiliser comme appel de fonction, prédéclarez-le ou utilisez des parenthèses.
Les mots nus sont dangereux en raison de ce comportement imprévisible. use strict; (or use strict 'subs';)
les rend prévisibles, car les mots simples qui pourraient causer un comportement étrange à l'avenir feront mourir votre programme avant qu'ils ne puissent faire des ravages
Il y a un endroit où il est acceptable d'utiliser des mots nus même lorsque vous avez activé les sous-marins stricts: lorsque vous attribuez des clés de hachage.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Les mots nus dans les clés de hachage sont toujours interprétés comme des chaînes, il n'y a donc pas d'ambiguïté.
utilisez des 'refs' stricts;
Cela génère une erreur d'exécution si vous utilisez des références symboliques, intentionnellement ou non. Une valeur qui n'est pas une référence ferme est alors traitée comme une référence symbolique . Autrement dit, la référence est interprétée comme une chaîne représentant le nom d'une variable globale.
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
utiliser des avertissements;
Ce pragma à portée lexicale permet un contrôle flexible sur les avertissements intégrés de Perl, à la fois ceux émis par le compilateur et ceux du système d'exécution.
De perldiag
:
Ainsi, la majorité des messages d'avertissement des classifications ci-dessous, c'est-à-dire W, D & S, peuvent être contrôlés à l'aide du warnings
pragma.
(W) Un avertissement (facultatif)
(D) Une obsolescence (activée par défaut)
(S) Un avertissement sévère (activé par défaut)
J'ai énuméré certains des messages d'avertissement qui se produisent souvent ci-dessous par classifications. Pour des informations détaillées sur eux et d'autres messages, reportez-vous à perldiag
(W) Un avertissement (facultatif):
Argument manquant dans% s
Argument manquant pour -% c
(Vouliez-vous dire &% s à la place?)
(Vouliez-vous dire "local" au lieu de "notre"?)
(Vouliez-vous dire $ ou @ au lieu de%?)
'% S 'n'est pas une
longueur de référence de code () utilisée sur% s
Misplaced _ en nombre
(D) Une obsolescence (activée par défaut):
défini (@array) est obsolète
défini (% hash) est obsolète L'
utilisation obsolète de my () dans false conditionnel
$ # n'est plus prise en charge
(S) Un avertissement sévère (activé par défaut)
elseif devrait être elsif
% s trouvé là où l'opérateur attendu
(Opérateur manquant avant% s?)
(Point-virgule manquant sur la ligne précédente?)
% s jamais introduit
Opérateur ou point-virgule manquant avant% s
Problème de priorité: open% s doit être ouvert (% s)
Incompatibilité de prototype:% s vs% s
Avertissement: l'utilisation de "% s" sans parenthèses est ambiguë
Impossible d'ouvrir% s:% s
use loose;