Il me semble que de nombreuses questions de la balise Perl pourraient être résolues si les gens utilisaient:
use strict;
use warnings;
Je pense que certaines personnes considèrent que cela s'apparente à des roues d'entraînement, ou à des complications inutiles, ce qui n'est clairement pas vrai, car même des programmeurs Perl très qualifiés les utilisent.
Il semble que la plupart des gens qui maîtrisent Perl utilisent toujours ces deux pragmas, alors que ceux qui bénéficieraient le plus de leur utilisation le font rarement. Donc, j'ai pensé que ce serait une bonne idée d'avoir une question à laquelle établir un lien pour encourager les gens à use strict
et warnings
.
Alors, pourquoi un développeur Perl use strict
et warnings
?
use loose;
use strict
c'était une bonne idée mais que la rétrocompatibilité est déjà devenue un réel problème pour vous :-(use strict;
est activé par défaut lorsque vous demandez le langage Perl 5.12 (ou supérieur). Essayezperl -e"use v5.012; $x=123;"
.no strict;
l'éteint réellement.Réponses:
Pour commencer,
use strict;
(et dans une moindre mesure,use warnings;
) aide à trouver des fautes de frappe dans les noms de variables. Même les programmeurs expérimentés font de telles erreurs. Un cas courant est d'oublier de renommer une instance d'une variable lors du nettoyage ou de la refactorisation du code.L'utilisation de
use strict; use warnings;
rattrape de nombreuses erreurs plus tôt qu'elles ne le seraient autrement, ce qui facilite la recherche des causes profondes des erreurs. La cause première peut être la nécessité d'une vérification d'erreur ou de validation, et cela peut se produire indépendamment de la compétence du programmeur.Ce qui est bien avec les avertissements Perl, c'est qu'ils sont rarement faux, donc leur utilisation est pratiquement gratuite.
Lecture connexe: Pourquoi utiliser
my
?la source
use strict;
est activé par défaut si vous utilisez la version 5.12 ou une version plus récente de la langue (use 5.012;
).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
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
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 voususe strict subs;
, cela provoquera la mort de ce programme avec une erreur: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
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 ravagesIl 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.
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.
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.la source
Ces deux pragmas peuvent identifier automatiquement les bogues dans votre code.
J'utilise toujours ceci dans mon code:
FATAL
fait mourir le code sur les avertissements, tout comme lestrict
fait.Pour plus d'informations, consultez: Soyez plus strict avec les avertissements d'utilisation FATAL => 'all';
Aussi ... Les sténoses, selon Seuss
la source
FATAL => "all"
exécution de la caisse, en attribuant à$SIG{__WARN__} = sub { croak "fatalized warning @_" };
ou bien vous bousillez le compilateur en essayant de vous dire ce dont il a besoin.perlbug
.Il y a un bon fil sur les perlmonks à propos de cette question.
La raison fondamentale est évidemment que les avertissements stricts et les avertissements vous aident massivement à détecter les erreurs et à faciliter le débogage.
la source
Source :: Différents blogs
la source
La directive "use strict" indique à Perl d'effectuer des vérifications supplémentaires lors de la compilation de votre code. L'utilisation de cette directive vous fera gagner du temps lors du débogage de votre code Perl car elle trouve des bogues de codage courants que vous pourriez ignorer autrement.
la source
Strict et avertissements garantissent que vos variables ne sont pas globales.
Il est beaucoup plus simple de pouvoir avoir des variables uniques pour des méthodes individuelles plutôt que d'avoir à garder une trace de chaque nom de variable.
$ _, ou aucune variable pour certaines fonctions, peut également être utile pour écrire du code plus compact plus rapidement.
Cependant, si vous n'utilisez pas strict et warnings, $ _ devient global!
la source
Strict et warnings sont le mode du programme perl. Cela permet à l'utilisateur de saisir le code de manière plus libérale et plus que cela, ce code perl aura l'air formel et sa norme de codage sera efficace.
warnings signifie la même chose que
-w
dans la ligne perl shebang, donc il vous fournira les avertissements générés par le programme perl, il s'affichera dans le terminalla source