perl initialise automatiquement les variables à Y a-t-il un moyen de remplacer ce comportement par défaut et de dire à l'interpréteur Perl d'initialiser les variables à UNDEF code> Par défaut. p>
zéro code> (ou une autre valeur fixe)? P>
5 Réponses :
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";
La recommandation dans le code complet est importante pour la langue telle que c car lorsque vous avez la valeur de en Perl, lorsque vous déclarez une variable utilisant p> Il ne fait aucun doute que la valeur du 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. P> Ce que vous faites avec des compteurs est d'incrémenter ou de les décrémenter. Le résultat de: p> est bien défini dans Perl. 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. p> p> compteur code> est ce qui occupe cette mémoire. < / p>
$ compteur code> est
Undef code> pas de déchets aléatoires. P>
Compteur $ code> conserve la valeur
1 code>. p>
Quand est-ce que réécrit i> se transformer en refactored i>, quand même? ☺
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: p> ou déplacer l'initialisation à une fonction: p> ou même: p> $ [ code>).
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.
Avez-vous une raison concrète de vouloir faire cela, ou est-ce simplement "parce que code complet em> dit que je devrais" p>
Si le premier, veuillez partager la raison et nous pouvons discuter correctement des moyens d'accomplir votre objectif réel. P>
Si ce dernier, rappelez-vous que code complet em> 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. P>
Pourquoi ne ferais-je pas simplement initialiser une variable juste avant sa première utilisation? p>
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 em> ce bloc qui fait également référence $ firstVariable. Maintenant, j'ai cassé ma routine en déplaçant des blocs de code. P>
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. P>
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! P>
Initialisation des variables à
Undef code> est toujours une initialisation.
Puis-je demander pourquoi i> 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.