Почему Perl позволяет взаимно использовать отношения между модулями? - PullRequest
8 голосов
/ 18 июня 2010

Допустим, есть два модуля, которые взаимно используют друг друга:

package a;
use b;
sub p {}

1;

package b;
use a;
1;

Я думаю, что систематически неправильно писать код, подобный описанному выше, потому что два модуля будут бесконечно копировать код друг друга в себя, но я могу успешно запустить следующий код, что меня очень удивляет. Кто-нибудь из вас может мне все это объяснить?

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

Ответы [ 3 ]

15 голосов
/ 18 июня 2010

потому что два модуля будут бесконечно копировать друг другу код

Нет, они не будут, как вы продемонстрировали с помощью кода, который удивил вас работой. Perl ведет запись в %INC, какие модули были загружены с use или require, и не будет пытаться перезагрузить их, если они получат use d или require d снова.

9 голосов
/ 18 июня 2010

Существует (как минимум) три разных способа загрузки чего-либо: use, require и do.

use - это в основном pimped require, и perldoc сообщает для require: требует, чтобы файл библиотеки был включен, если он еще не был включен. Так что никаких проблем нет.

do - это другая история. Он запускает файл и более или менее похож на eval или C #include. Взаимное включение через do должно быть фатальным.

7 голосов
/ 18 июня 2010

Насколько я помню, директива perl "use" выполняет проверку, загружен ли уже модуль.Это делается путем вызова функции require ().Итак, бесконечной копии не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...