Вы не попадете в бесконечный цикл из-за специального хеша %INC
:
% INC
Хеш %INC
содержит записи для каждого имени файла, включенные с помощью операторов do
, require
или use
. Ключ - это имя файла, которое вы указали (с именами модулей, преобразованными в пути), а значение - это местоположение найденного файла. Оператор require
использует этот хэш, чтобы определить, был ли конкретный файл уже включен.
Также помните, что use Module LIST
эквивалентно
BEGIN { require Module; Module->import( LIST ); }
Поэтому, когда основная программа использует Module1
, происходит следующая последовательность:
require Module1
(из пакета main
)
require Module2
(из пакета Module 1
)
require Module1
(ничего не делает, потому что Module1
уже в %INC
)
Module1->import
(в пакет Module2
)
Module2->import
(в пакет Module1
)
Module1->import
(в пакет main
)