импорт 2 модулей с использованием - PullRequest
2 голосов
/ 08 апреля 2010

У меня есть 2 модуля Perl, каждый модуль использует второй, т.е. Module1.pm

использовать Module2

Module2.pm

использовать Module1

что происходит на фоне, когда я загружаю эти 2 модуля с использованием использовать Module1; использовать Module2;

Может кто-нибудь объяснить, что происходит на заднем плане и почему я не вхожу в бесконечный цикл?

1 Ответ

10 голосов
/ 08 апреля 2010

Вы не попадете в бесконечный цикл из-за специального хеша %INC:

% INC
Хеш %INC содержит записи для каждого имени файла, включенные с помощью операторов do, require или use. Ключ - это имя файла, которое вы указали (с именами модулей, преобразованными в пути), а значение - это местоположение найденного файла. Оператор require использует этот хэш, чтобы определить, был ли конкретный файл уже включен.

Также помните, что use Module LIST эквивалентно

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

Поэтому, когда основная программа использует Module1, происходит следующая последовательность:

  1. require Module1 (из пакета main)
  2. require Module2 (из пакета Module 1)
  3. require Module1 (ничего не делает, потому что Module1 уже в %INC)
  4. Module1->import (в пакет Module2)
  5. Module2->import (в пакет Module1)
  6. Module1->import (в пакет main)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...