Скажем, существует два модуля, которые взаимно используют друг друга:
package a;
use b;
sub p {}
1;
package b;
use a;
1;
Я думаю, что систематически неправильно написать код как вышеупомянутое, потому что эти два модуля бесконечно скопируют код друг друга в себя, но я могу успешно выполнить следующий код, который делает меня очень удивленным. Какой-либо из Вас мог объяснить все это мне?
#! /usr/bin/perl
use a;
a->p();
потому что два модуля будут бесконечно копировать код друг друга себе
Нет, не будут, как вы продемонстрировали с кодом, который удивил вас своей работой. Perl хранит запись в % INC
, из которых модули были загружены с помощью use
или require
, и не будет пытаться перезагрузить их, если они получат use
d или снова требуется
d.
Насколько я помню, директива use perl проверяет, загружен ли уже модуль. Это делается путем вызова функции require (). Итак, бесконечной копии не бывает.
Существует (по крайней мере) три различных способа загрузки чего-либо: use
, require
и do
.
use
- это, по сути, pimped require
, а perldoc states для require
: require требует, чтобы файл библиотеки был включен, если он еще не был включен. Так что здесь нет проблем.
do
- это совсем другая история. Он выполняет файл и более или менее похож на eval
или #include
языка Си. Взаимное включение через do
должно быть фатальным.