8
votes

Comment puis-je initialiser automatiquement toutes les variables scalaires à Perl?

perl initialise automatiquement les variables à UNDEF Par défaut.

Y a-t-il un moyen de remplacer ce comportement par défaut et de dire à l'interpréteur Perl d'initialiser les variables à zéro (ou une autre valeur fixe)?


3 commentaires

Initialisation des variables à Undef est toujours une initialisation.


Puis-je demander pourquoi vous voudriez faire cela?


@Zaid: L'histoire complète - Je suis le code de lecture complète (qui mentionne toujours les variables lors de la déclaration, si possible) et examinait l'un de mes anciens fichiers qui utilise beaucoup de compteurs que j'avais tous initialisés à Zero < / Code> Initialement, mais a ensuite supprimé toutes les initialisations inutiles. Je pense à réintroduire toutes les initialisations et à poser cette question de trouver une meilleure façon de le faire.


5 Réponses :


5
votes

Non. Faire cela peut conduire à des bugs très effrayants et difficiles à déchiffrer, ce n'est donc pas une bonne idée de changer de comportement comme celui-ci.

à Perl, vous pouvez déclarer des variables à droite lorsque vous en avez besoin pour la première fois. Il n'est généralement pas nécessaire de les déclarer d'abord (avec ou sans initialisation), puis les utiliser plus tard. De plus, des opérateurs tels que ++ code> fonctionneront avec des valeurs non définies aussi bien que zéro, de sorte que vous n'avez pas besoin d'initialiser les comptoirs du tout: P>

package MyClass;
use strict;
use warnings;
use Moose;

has some_string => (
    is => 'rw', isa => 'Str',
    default => 'initial value',
);

has some_number => (
    is => 'rw', isa => 'Int',
    default => 0,
);
__PACKAGE__->meta->make_immutable;
1;

package main;
my $object = MyClass->new;
print "string has value: ", $object->some_string, "\n";
print "number has value: ", $object->some_number, "\n";


0 commentaires

13
votes

La recommandation dans le code complet est importante pour la langue telle que c car lorsque vous avez xxx

la valeur de compteur est ce qui occupe cette mémoire. < / p>

en Perl, lorsque vous déclarez une variable utilisant xxx

Il ne fait aucun doute que la valeur du $ compteur est Undef pas de déchets aléatoires.

Par conséquent, la motivation de la recommandation, c'est-à-dire pour que toutes les variables commencent avec des valeurs connues, sont automatiquement satisfaites dans Perl et il n'est pas nécessaire de faire n'importe quoi.

Ce que vous faites avec des compteurs est d'incrémenter ou de les décrémenter. Le résultat de: xxx

est bien défini dans Perl. Compteur $ conserve la valeur 1 .

Enfin, je dirais que, dans la plupart des cas, les compteurs ne sont pas nécessaires dans Perl et le code faisant état L'utilisation de variables de comptoir peut avoir besoin d'être réécrite.


1 commentaires

Quand est-ce que réécrit se transformer en refactored , quand même? ☺



12
votes

Autant que je sache, cela n'est pas possible (et ne devrait pas être, c'est encore plus dangereux que $ [).

Vous pouvez initialiser vos variables comme suit pour réduire Boiserie: xxx

ou déplacer l'initialisation à une fonction: xxx

ou même: xxx


4 commentaires

C'est l'index que les tableaux commencent. C'était là pour faire que Perl se comporter comme Awk en la définissant à 1. Il est obsolète et avertit et ne dispose que d'une portée de fichier et doit être définie lors de la compilation en raison de tous les bugs qu'il pourrait causer dans un code non apparenté. Perldoc perlvar pour plus d'informations


Je ne vois pas pourquoi vous auriez besoin d'initialiser quelque chose à zéro à son point de déclaration.


@Tchrist => Si la première expression qu'une variable est utilisée est une expression mathématique de comparaison ou complexe (pensez à Itérateur Sub avec fermeture fermée), vous obtiendrez un avertissement sur les valeurs non définies. Dans ces cas, l'initialisation sur le site de déclaration semble être aussi bonne une place.


Eh bien, peut-être. Mais je les garde habituellement à zéro lorsque je veux les tester de manière boolisée, ou utilisez ++ ou + = sur, dont aucun ne nécessite telle.



1
votes

Avez-vous une raison concrète de vouloir faire cela, ou est-ce simplement "parce que code complet dit que je devrais"

Si le premier, veuillez partager la raison et nous pouvons discuter correctement des moyens d'accomplir votre objectif réel.

Si ce dernier, rappelez-vous que code complet est un ensemble de directives pour la programmation en C, et non Perl. Perl n'est pas C et a son propre ensemble de forces et de faiblesses, ce qui signifie également qu'il a un ensemble différent de ... et je déteste utiliser cette phrase ... meilleures pratiques. Les directives appropriées pour une langue ne s'appliquent pas nécessairement à l'autre. "Toujours initialiser les variables (si possible) lorsque vous les déclarez" est une pratique sonore en C, mais généralement inutile dans Perl.


0 commentaires

0
votes

Pourquoi ne ferais-je pas simplement initialiser une variable juste avant sa première utilisation?

Réponse: Je garde beaucoup de "code de stock" à propos de. L'ensemble "juste le déclarer" lors de la première utilisation ne fonctionne pas vraiment avec mon style de production. Je pourrais écrire quelque chose où "mon $ maylvariable = 0;" est inclus comme la première ligne d'un bloc de code; Ensuite, insérez quelque chose ci-dessus ce bloc qui fait également référence $ firstVariable. Maintenant, j'ai cassé ma routine en déplaçant des blocs de code.

Si je "déclarer" toutes les variables, j'aurai besoin au sommet, je n'ai pas à vous soucier de réorganiser les blocs de code tuant la procédure en raison de la précision des déclarations variables nécessaires.

En outre, si les déclarations variables sont en haut, je peux facilement commenter une déclaration, puis essayez d'exécuter la routine. Cela peut être pratique pour dépanner des programmes importants et complexes, car il produira une liste, avec des numéros de ligne, de chaque endroit que la variable [maintenant non déclarée] est référencée. Quand j'ai fini de chercher tout ce qui est de la recherche, je supprime simplement le caractère de commentaire et je suis de retour en opération!


0 commentaires