32 votes

Pourquoi les avertissements d'utilisation; l'utilisation stricte; pas par défaut dans Perl?

Je me demande pourquoi

use warnings;
use strict;

ne sont pas par défaut dans Perl. Ils sont nécessaires pour chaque script. Si quelqu'un (pour de bonnes raisons) doit désactiver eux, ils devraient utiliser no strict et/ou devrait utiliser un argument de ligne de commande (pour les one-liners).

Sont-ils trop nombreux mal écrits des modules de CPAN (à l'aide de "mal" pour signifier sans use strict)? Ou est-ce parce que cela peut casser beaucoup de code déjà en production? Je suis sûr qu'il y a une raison et je voudrais savoir s'il.

Dans 5.14 IO::File est chargé automatiquement à la demande, ne serait-il pas possible de faire quelque chose comme ça avec la base de ces pragmas?

53voto

cjm Points 44090

C'est pour assurer la compatibilité ascendante. Perl 4 n'a pas stricte du tout, et il y a probablement encore des scripts, il écrit à l'origine pour Perl 4 qui fonctionnent toujours très bien avec Perl 5. Faire le strict automatique de casser ces scripts. La situation est encore pire pour les one-liners, dont beaucoup ne sont pas la peine de déclarer les variables. Faire des one-liners stricte par défaut briserait probablement des millions de scripts shell, et les Makefiles là-bas.

Il ne peut pas être chargé automatiquement, car il ajoute de restrictions, pas de fonctionnalités. C'est une chose de charge IO::File lorsqu'une méthode est appelée sur un descripteur de fichier. Mais l'activation strict, sauf si le code fait quelque chose d'interdit par la stricte est dénuée de sens.

Si un script spécifie une version minimale de 5.11.0 ou plus (par exemple, use 5.012), puis strict est activé automatiquement. Ce n'est pas activer les avertissements, mais ce sera peut-être ajouté dans une version future. Aussi, si vous ne la programmation orientée-objet en Perl, vous devez savoir que l'utilisation de l'Orignal se met automatiquement sur les deux strict et warnings dans cette classe.

17voto

daxim Points 31874

Si vous êtes sur un Perl moderne, dites-le, vous avez juste à l'activer. 5.12 s'applique `` à l'exception des monolignes. Il ne peut pas être par défaut en raison de la compatibilité vers l'arrière.

17voto

daotoad Points 17916

Eh bien, use strict valeur par défaut est maintenant, en quelque sorte.

Depuis Perl 5.12.0 si vous avez besoin d'une version de Perl >= 5.12.0, alors votre script devra tous les incompatibles avec les fonctionnalités activées, y compris stricte par défaut.

use 5.12.0;
use warnings;

Est le même que:

use strict;
use warnings;
use feature ':5.12';

Il n'a pas été allumé de façon plus générale, car cela permettrait de briser les scripts que les gens dépendent pour "fonctionne".

Orignal, s'allume automatiquement stricte et d'avertissements lorsque vous l'utilisez. Donc, si vous vous occupez de l'Orignal en fonction de la programmation orientée objet en Perl, alors vous obtenez un laissez-passer gratuit ici, trop.

10voto

Wes Hardaker Points 10426

C'est une question philosophique, et non pas "ça ne marchera pas" à la question.

Tout d'abord, perl a toujours été sous l' "vous pouvez le faire de manière incorrecte si vous voulez" type de paradigme. C'est pourquoi il ya beaucoup de perl ennemis là-bas. Beaucoup préféreraient que la langue toujours vous forcer à écrire du bon code, mais de nombreux rapide-script-les pirates ne veulent pas. Considérer:

perl -e '@a = split(/[,:]/, $_); print $a[1],"\n";'

Maintenant, il serait facile d'ajouter un " mon " devant le @a, mais pour une seule ligne, un script en temps les gens ne veulent pas le faire.

Deuxièmement, oui, je pense que la plupart de CPAN aurait en effet besoin d'être réécrit.

Il n'y a pas une bonne réponse, vous l'aimerez, j'en ai peur.

-3voto

fvox Points 631

Vous pouvez utiliser la common::sens de module, si vous avez besoin de:

use utf8;
l'utilisation stricte qw vars(subs);
utilisez la fonctionnalité qw(dire de l'état de l'interrupteur);
pas de mises en garde;
utilisez les mises en garde qw(FATAL fermé threads internes de débogage pack
 portable prototype en place io pipe décompresser malloc
 obsolète glob chiffres printf couche
 réservé souillure de fermeture de point-virgule);
pas de mises en garde qw(exec retour à la ligne non ouvert);

Il réduit l'utilisation de la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X