web-dev-qa-db-fra.com

Pourquoi utiliser strict et avertissements?

Il me semble que beaucoup de 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 ressemble à des roues d’entraînement ou à des complications inutiles, ce qui n’est manifestement pas vrai, car même les programmeurs Perl très expérimentés les utilisent.

Il semble que la plupart des personnes qui maîtrisent Perl utilisent toujours ces deux pragmas, alors que ceux qui bénéficieraient le plus de les utiliser le font rarement. Alors, j’ai pensé que ce serait une bonne idée d’avoir une question à laquelle renvoyer pour encourager les gens à use strict et warnings.

Alors, pourquoi un développeur Perl use strict et warnings?

100
TLP

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 consiste à oublier de renommer une instance d'une variable lors du nettoyage ou du refactoring de code.

En utilisant use strict; use warnings; détecte beaucoup d'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 arriver quelle que soit la compétence du programmeur.

Ce qui est bien avec les avertissements Perl, c’est qu’ils sont rarement fantasmagoriques; leur utilisation est donc pratiquement gratuite.


Lecture connexe: Pourquoi utiliser my?

80
ikegami

Apparemment, use strict Devrait (doit) être utilisé lorsque vous voulez forcer Perl à coder correctement, ce qui pourrait être une déclaration forcée, être explicite sur des chaînes et des sous-mots, par exemple des mots nus, ou utiliser des références avec prudence. Remarque: s'il y a des erreurs, use strict stoppe l'exécution, le cas échéant.

Tandis que use warnings; Vous aidera à trouver les erreurs de frappe dans les programmes comme si vous aviez manqué un point-virgule, vous avez utilisé 'elseif' et non 'elsif', vous utilisez une syntaxe ou une fonction obsolète, peu importe. Remarque: l'utilisation des avertissements ne contiendra que des avertissements et continuera l'exécution, c'est-à-dire n'abandonnera pas l'exécution.

Quoi qu'il en soit, il serait préférable que nous entrions dans les détails, ce que je précise ci-dessous

De Perl.com (mon préféré):

utilise 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" requiert le nom explicite du package à scriptname.pl, ligne 3

Cet avertissement signifie que Perl ne sait pas exactement quelle est la portée de la variable. Vous devez donc être explicite sur vos variables, ce qui signifie soit de les déclarer avec my pour qu’elles soient restreintes au bloc actuel, ou de les référencer avec leur nom complet (par exemple: $ MAIN :: nom_variable) .

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. (Le vars pragma use simule une importation, mais utilise notre à la place.)

  • Entièrement qualifié en utilisant son nom de paquet et le séparateur de paquet à deux points.

utilise des 'subs' stricts;

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 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 arrivons à $a = test_value;, Perl ne connaît pas de test_value (), et test_value est interprété comme une chaîne 'test_value'. Dans le second programme, la définition de test_value () précède la ligne $a = test_value;. Perl considère test_value comme un sous-appel.

Le terme technique utilisé pour désigner des mots isolés tels que test_value, qui pourraient être des sous-titres et des chaînes dépendant du contexte, est soit mot nu. Le traitement par Perl de mots nus peut être déroutant et peut causer des bogues dans le programme.

Le bogue correspond à ce que nous avons rencontré dans notre premier programme. Rappelez-vous que Perl n’attendra pas avec impatience de trouver test_value(); ainsi, comme il n’a pas encore vu test_value (), il suppose que vous voulez une chaîne. Donc, si vous use strict subs;, Le programme disparaîtra avec une erreur:

Le mot clé "valeur_test" n'est pas autorisé tant que "subs strict" est utilisé à la ligne ./a6-strictsubs.pl.

La solution à cette erreur serait
1. Utilisez des parenthèses pour indiquer que vous appelez un sous-marin. Si Perl voit $ a = test_value () ;,
2. Déclarez 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 chaîne, citez-la.

Ainsi, cette restriction fait en sorte que Perl traite tous les mots nus comme des erreurs de syntaxe. * A bareword est un nom simple ou un identificateur pour lequel aucune autre interprétation n'est forcée par le contexte. (Le contexte est souvent forcé par un mot clé ou un jeton à proximité, ou par une 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 à cause de ce comportement imprévisible. use strict; (or use strict 'subs';) les rend prévisibles, car les mots nus pouvant provoquer un comportement étrange dans le futur feront mourir votre programme avant qu'il ne puisse faire des ravages.

Il y a un endroit où il est correct d'utiliser des mots nus même lorsque vous avez activé des 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 aucune ambiguïté.

utilise des 'références' strictes;

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 dure est alors traitée comme une référence symbolique. C'est-à-dire que 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.

utilise des avertissements;

Ce pragma à portée lexicale permet un contrôle flexible des 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, à savoir W, D & S, peuvent être contrôlés à l’aide du pragma warnings.

(W) Un avertissement (facultatif)
(D) Une dépréciation (activée par défaut)
(S) Un avertissement grave (activé par défaut)

J'ai énuméré certains des avertissements qui apparaissent souvent ci-dessous par classifications. Pour des informations détaillées sur eux et sur les autres messages, reportez-vous à perldiag

(W) Un avertissement (facultatif):

Argument manquant dans% s
Argument manquant pour -% c
(Voulez-vous dire &% s à la place?)
(Voulez-vous dire "local" au lieu de "notre"?)
(Voulez-vous dire $ ou @ au lieu de%?)
'% s' n'est pas une référence de code
length () utilisé sur% s
Mis en place _ en nombre

(D) Une dépréciation (activée par défaut):

fined (@array) est obsolète
défini (% hash) est obsolète
Usage déconseillé de my () dans false condition
$ # n'est plus supporté

(S) Un avertissement grave (activé par défaut)

elseif devrait être elsif
% s trouvé à l'endroit prévu par l'opérateur
(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é:% s ouvert devrait être ouvert (% s)
Incohérence prototype:% s vs% s
Avertissement: L'utilisation de "% s" sans parenthèses est ambiguë
Impossible d'ouvrir% s:% s

27
user966588

Ces deux pragmas peuvent identifier automatiquement les bogues dans votre code.

Je l'utilise toujours dans mon code:

use strict;
use warnings FATAL => 'all';

FATAL fait mourir le code sur les avertissements, tout comme strict.

Pour plus d'informations, voir: Soyez plus strict avec les avertissements d'utilisation FATAL => 'all';

Aussi ... Les restrictions, selon Seuss

10
toolic

Il y a n bon fil sur perlmonks à propos de cette question.

La raison fondamentale est évidemment que des avertissements stricts et massifs vous aident à détecter les erreurs et à faciliter le débogage.

9
moodywoody

Source :: Différents blogs

Use exportera les fonctions et les noms de variables vers l’espace de noms principal en appelant la fonction import () des modules.

Un pragma est un module qui influence certains aspects du comportement lors de la compilation ou de l'exécution de Perl.Pragmas donne des indications au compilateur.

Utiliser des avertissements - Plaintes Perl concernant des variables utilisées une seule fois, conversions incorrectes de chaînes en nombres, .Essayer d'écrire dans des fichiers qui ne sont pas ouverts. Cela se produit lors de la compilation. Il est utilisé pour contrôler les avertissements.

Utilisez strict - déclarez la portée des variables. Il est utilisé pour définir une sorte de discipline dans le script.Si des mots nus sont utilisés dans le code, ils sont interprétés.Toutes les variables doivent avoir une portée, comme mon, notre ou local.

3
Rahul Reddy

La directive "use strict" demande à Perl d'effectuer des vérifications supplémentaires lors de la compilation de votre code. L'utilisation de cette directive vous permettra de gagner du temps lors du débogage de votre code Perl car il détecte des bogues de codage courants que vous pourriez autrement ignorer.

1
MikasaAckerman
use strict;
use warnings;

Strict et warnings sont le mode du programme Perl. Cela permet à l'utilisateur de saisir le code plus librement et plus encore, le code Perl aura une apparence formelle et sa norme de codage sera efficace.

avertissements 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 terminal

0
dhana govindarajan

Strict et avertissements vous assurer que vos variables ne sont pas globales.

Il est beaucoup plus judicieux de pouvoir disposer de variables uniques pour des méthodes individuelles plutôt que de devoir suivre chaque nom de variable.

$ _, ou aucune variable pour certaines fonctions, peut également être utile pour écrire plus rapidement du code plus compact.

Cependant, si vous n'utilisez pas strict et warnings, $ _ devient global!

0
Andreas Ährlund