Disons qu'il y a deux modules qui s'y utilisent mutuellement:
#! /usr/bin/perl use a; a->p();
3 Réponses :
Autant que je me souvienne de "utiliser" la directive Perl effectue la vérification si le module est déjà chargé. C'est fait en appelant besoin () fonction. Donc, il n'y a pas de copie sans fin. P>
Il y a (au moins) trois manières différentes de chargement quelque chose: Utiliser code>,
nécessite code> et
faire code>. p>.
Utiliser code> est fondamentalement un pimped
exiger code> et perdoc States pour
exiger code>: nécessite des demandes qu'un fichier de bibliothèque soit inclus s'il n'a pas déjà été inclus. EM> Donc, pas de problème là-bas. P>
faire code> est une histoire différente. Il exécute le fichier et est plus ou moins comme
eval code> ou C
#include code>. Inclusion mutuelle via
faire code> devrait être fatale. P>
DO CODE> est diabolique et est mieux évité.
Lorsque votre objectif est d'exécuter un fichier arbitraire (hé, c'est Perl) plutôt que de l'inclure comme un package, alors faire code> semble être le moyen d'aller. Peut-être que cela ne correspond pas vraiment dans ce contexte; Je me souviens juste de cela de cette façon parce que Début de Perl i> listons
faire code> dans le chapitre sur les modules.
Si votre objectif est d'exécuter un fichier arbitraire, vous souhaiterez peut-être reconsidérer votre conception.
@DaoToad: C'est ce que ma remarque entre parenthèses était pour. En général, vous avez raison.
Parce que les deux modules copieront sans cesse le code de chacun à eux-mêmes p> blockQuote>
Non, ils ne le feront pas, comme vous l'avez démontré avec le code qui vous a surpris en travaillant. Perl conserve un enregistrement dans
% inc code> de quels modules ont été chargés avec
Utiliser code> ou
nécessitent code> et ne tenteront pas de les recharger si elles obtiennent
Utiliser code> d ou
exiger code> D à nouveau. p>
«Utilisation d'un module ne copie rien, sauf si vous configurez un
@export code> ou de copier spécifiquement quelque chose dans une autre table de symboles.