2010-04-08 8 views
2

J'ai 2 modules perl tous les modules utilisent le second à savoir Module1.pmimportateurs 2 modules avec utilisation

utilisation Module2

Module2.pm

utilisation Module1

ce qui se passe sur l'arrière-plan quand je charge ces 2 modules avec l'utilisation use Module1; utiliser Module2;

quelqu'un pourrait expliquer ce qui se passe sur l'arrière-plan et pourquoi je ne pas entrer dans la boucle infinie?

+1

Qu'est-il arrivé lorsque vous avez essayé ? –

+0

Si vous êtes dans cette situation, je suggère que vous devriez jeter un oeil à votre design actuel, car il est cassé. Une dépendance circulaire dans les bibliothèques est juste fausse. Dans un langage interprété comme Perl, vous pourriez vous en sortir, mais cela ne fonctionnera pas pour un langage compilé. Vous devriez envisager de reconcevoir les modules affectés dans cette situation. – Htbaa

Répondre

10

Vous ne tombez pas dans une boucle infinie à cause de la table de hachage %INC:

% INC
Le hachage %INC contient des entrées pour chaque nom de fichier inclus par les do, require ou use opérateurs . La clé est le nom de fichier que vous avez spécifié (avec les noms de modules convertis en chemins d'accès), et la valeur est l'emplacement du fichier trouvé. L'opérateur require utilise ce hachage pour déterminer si un fichier particulier a déjà été inclus.

Aussi, rappelez-vous que use Module LIST est équivalent à

BEGIN { require Module; Module->import(LIST); } 

Ainsi, lorsque le programme principal utilise Module1, la séquence suivante se produit:

  1. require Module1 (du paquet main)
  2. require Module2 (du paquet Module 1)
  3. require Module1 (ne fait rien parce que Module1 est déjà %INC)
  4. Module1->import (dans le paquet Module2)
  5. Module2->import (dans le paquet Module1)
  6. Module1->import (dans le paquet main)
Questions connexes