Variables locales statiques en Perl
Je suis à la recherche pour obtenir des conseils sur Perl best practices. J'ai écrit un script qui a compliqué expression régulière:
my $regex = qr/complicated/;
# ...
sub foo {
# ...
if (/$regex/)
# ...
}
où foo
est une fonction qui est appelée souvent, et $regex
n'est pas utilisé en dehors de cette fonction. Quelle est la meilleure façon de gérer ce genre de situation? Je veux seulement pouvoir être interprété en une fois, car c'est long et compliqué. Mais il semble un peu douteuse de l'avoir dans une portée mondiale, puisqu'il n'est utilisé que dans ce sous. Est-il un moyen raisonnable de déclarer statique?
Un problème similaire se pose avec une autre peut-être-injustifiée mondiale. On y lit la date et l'heure actuelles et les formats de manière appropriée. C'est aussi utilisé de nombreuses fois, et encore, seulement dans une fonction. Mais dans ce cas il est encore plus important qu'il ne soit pas ré-initialisé, puisque je veux que toutes les instances de la date-heure d'être la même à partir d'une invocation du script, même si le procès-verbal rouler pendant l'exécution.
Pour le moment j'ai quelque chose comme
my ($regex, $DT);
sub driver {
$regex = qr/complicated/;
$DT = dateTime();
# ...
}
# ...
driver();
dont au moins légèrement sépare. Mais peut-être il ya de meilleures façons.
De nouveau: je suis à la recherche de la bonne façon de le faire, en termes de meilleures pratiques suivantes Perl et les expressions idiomatiques. La Performance est belle, mais la lisibilité et d'autres besoins prioritaires si je ne peux pas tout avoir.
source d'informationauteur Charles
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez perl 5.10+, utilisez un
state
variable.auront
something_expensive
une fois.Si vous avez besoin de travailler avec les anciens perls, puis utiliser une variable lexicale à l'extérieur de la portée avec une paire supplémentaire de croisillons:
cela permet de maintenir
$foo
de fuite à personne, sauf pourwomble
.Est-il de l'interpolation dans le modèle? Si pas, le motif ne seront compilées une fois peu importe combien de fois le qr//est exécutée.
Même si il y a d'interpolation, le modèle ne seront compilés si l'interpolation des variables ont changé.
Sinon, vous pouvez utiliser
ou
Regexes peut être spécifié avec le "o" modificateur, qui dit "compiler modèle, une seule fois" - dans le 3ème. édition du Chameau, voir p. 147
Il y a un état mot clé qui peut être une bonne solution pour cette situation:
Je voudrais pour terminer
ikegami
's grande réponse. Quelques mots de plus je tiens à déchets sur la définition des variables locales dans le pré 5.10 perl.Voyons un exemple simple de code:
L'utilisateur devrait s'attendre à ce que les deux
sub
affichera la variable locale, mais ce n'est pas vrai!De sortie:
La raison en est que
show2
est analysée, mais l'initialisation de la variable locale n'est pas exécuté! (Bien sûr, siexit
est retiré et uneshow2
est ajouté à la fin,Solaris
sera imprimé dans le tiers de la ligne)Cela peut facilement être corrigé:
Et maintenant la sortie de ce qui était attendu:
Mais
state
dans la version 5.10+ est un meilleur choix...J'espère que cela aide!