Apparemment use strict
doit(doivent) être utilisés lorsque vous souhaitez forcer perl le code correctement, ce qui pourrait obliger la déclaration, être explicite sur les cordes et les subs c'est à dire barewords ou à l'aide de refs avec prudence.
Alors qu' use warnings;
va vous aider à trouver les erreurs de frappe dans le programme que vous avez manqué un point-virgule, vous utilisé le "elseif" et non de "else", vous utilisez obsolètes ou la syntaxe de la fonction, quelle que soit comme ça.
De toute façon, Il serait mieux si nous allons dans les détails, je suis spécifier ci-dessous
À partir de perl.com (mon préféré):
use strict 'vars';
ce qui signifie que vous devez toujours déclarer les variables avant de les utiliser.
Si vous ne déclarez pas, vous aurez probablement obtenir un message d'erreur pour la variable non déclarée
Mondial symbole "$variablename" explicite nom du package à scriptname.pl la ligne 3
Cet avertissement signifie Perl n'est pas exactement clair sur ce que la portée de la variable est. Si vous avez besoin d'être explicite quant à vos variables, ce qui signifie soit déclarant avec my
de sorte qu'ils sont limités pour le bloc courant, ou en se référant à eux avec leur nom complet (ex: $MAIN::variablename).
Ainsi, une erreur de compilation se produit lorsque vous tentez d'accéder à une variable qui n'a pas rencontré au moins un des critères suivants:
Prédéfinies par Perl lui-même, comme @ARGV, %ENV, et l'ensemble de ces signes de ponctuation variables comme $. ou $_.
Déclarée à la notre (global) ou ma (lexicale).
Importé d'un autre paquet. (L'utilisation de vars pragma faux d'une importation, mais utilisez notre place.)
Pleinement qualifié en utilisant son nom et le double deux-points paquet séparateur.
use strict 'subs';
Considérons 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 te st_value() sub et nous voulons mettre le résultat dans $un. Et pourtant, quand nous exécuter les deux programmes, on obtient deux résultats différents:
Dans le premier programme, au point de nous rendre à $a = test_value;
, Perl ne sais pas du tout te st_value() sub, et te st_value est interprété comme une chaîne de caractères 'te st_value'. Dans le second programme, la définition de te st_value() vient avant l' $a = test_value;
ligne de. Perl pense te st_value sous appel.
Le terme technique pour des mots isolés, comme te st_value qui pourraient être sous-marins et peut-être des chaînes de caractères selon le contexte, le mot nu. Perl est de la manipulation de barewords peut être source de confusion, et il peut provoquer des bug dans le programme.
Le bug est ce que nous avons rencontrées dans notre premier programme, n'oubliez pas que Perl ne le regretterez pas en avant pour trouver de test_value()
, donc depuis il n'a pas déjà vu te st_value(), il suppose que vous voulez une chaîne de caractères. Donc, si vous use strict subs;
, il sera la cause de ce programme à mourir avec une erreur:
Mot nu test_value'' not allowed while
strict subs" en usage à
./a6-strictsubs.pl la ligne 3.
La Solution à ce qui serait une erreur
1. Utilisez des parenthèses pour préciser que vous appelez un sous. Si Perl voit $a = te st_value();,
2. Déclarer votre sous-avant la première utilisation
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 de caractères, le citer.
Ainsi, Cette contrainte rend Perl traiter tous les barewords que les erreurs de syntaxe. *Un mot nu est tout nu nom ou l'identifiant qui n'a pas d'autre interprétation forcée par le contexte. (Contexte est souvent contraint par la proximité du mot-clé ou un jeton ou par predeclaration du mot en question.)* Donc, Si vous voulez l'utiliser comme une chaîne de caractères, devis et Si tu veux l'utiliser comme un appel de fonction, predeclare ou utiliser des parenthèses.
Barewords sont dangereux en raison de ce comportement imprévisible. use strict; (or use strict 'subs';)
qui les rend prévisibles, parce que barewords qui pourrait provoquer un comportement étrange dans l'avenir fera de votre programme de mourir avant qu'ils peuvent faire des ravages
Il y a un endroit où c'est OK pour utiliser barewords même lorsque vous avez activé la stricte subs: lorsque vous assignez des clés de hachage.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Barewords dans les clés de hachage sont toujours interprétées comme des chaînes de caractères, donc il n'y a pas d'ambiguïté.
use strict 'refs';
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 dur de référence est alors traité comme une référence symbolique. Qui est, la référence est interprété comme une chaîne de caractères 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.
utilisez les mises en garde;
Ce correspondant a une portée lexicale pragma permet un contrôle flexible sur Perl intégré dans les mises en garde, à la fois ceux émis par le compilateur ainsi que de celles du système d'exécution.
D' perldiag
:
De sorte que La majorité des messages d'avertissement des classifications ci-dessous c'est à dire W, D & S peut être contrôlé à l'aide de l' warnings
pragma.
(W) Un avertissement (facultatif)
(D) Une dépréciation (activé par défaut)
(S) Un avertissement sévère (activé par défaut)
J'ai répertorié quelques-uns des messages d'avertissements celles qui se produit souvent en dessous par les classifications. Pour obtenir des informations détaillées sur eux et les autres, messages, consultez perldiag
(W) Un avertissement (facultatif):
Argument manquant de %s
Argument manquant à -%c
(Avez-vous dire &%s à la place?)
(Avez-vous voulu dire "local" au lieu de "notre"?)
(As-tu veux dire $ ou @ au lieu de %?)
'%s' n'est pas un code de référence
longueur() utilisé sur %s
Égaré _ nombre
(D) Une dépréciation (activée par défaut):
défini(@tableau) est obsolète
défini(%hash) est obsolète
Déconseillées utilisation de mon (), false conditionnel
$# est plus pris en charge
(S) Un avertissement sévère (activé par défaut)
elseif devrait être elsif
%s trouvé où l'opérateur devrait
(Opérateur absent avant de %s?)
(Manque le point-virgule sur la ligne précédente?)
de %s est jamais présenté
Opérateur ou un point-virgule manquant avant de %s
La préséance problème: ouvrir %s doit être ouvert(%s)
Prototype d'incompatibilité: %s vs de %s
Avertissement: l'Utilisation de "%s", sans parenthèses est ambigu
Ne peut pas ouvrir %s: %s