8
votes

Pourquoi Perl autorise-t-il des relations mutuelles "user" entre les modules?

Disons qu'il y a deux modules qui s'y utilisent mutuellement:

#! /usr/bin/perl
use a;
a->p();


1 commentaires

«Utilisation d'un module ne copie rien, sauf si vous configurez un @export ou de copier spécifiquement quelque chose dans une autre table de symboles.


3 Réponses :


7
votes

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.


0 commentaires

9
votes

Il y a (au moins) trois manières différentes de chargement quelque chose: Utiliser , nécessite et faire . .

Utiliser est fondamentalement un pimped exiger et perdoc States pour exiger : nécessite des demandes qu'un fichier de bibliothèque soit inclus s'il n'a pas déjà été inclus. Donc, pas de problème là-bas.

faire est une histoire différente. Il exécute le fichier et est plus ou moins comme eval ou C #include . Inclusion mutuelle via faire devrait être fatale.


4 commentaires

DO 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 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 listons faire 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.



15
votes

Parce que les deux modules copieront sans cesse le code de chacun à eux-mêmes

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 de quels modules ont été chargés avec Utiliser ou nécessitent et ne tenteront pas de les recharger si elles obtiennent Utiliser d ou exiger D à nouveau.


0 commentaires