Почему Perl позволяет взаимные отношения “использования” между модулями?

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

package a;
use b;
sub p {}

1;

package b;
use a;
1;

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

#! /usr/bin/perl
use a;
a->p();
8
задан Svante 18 June 2010 в 09:30
поделиться

3 ответа

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

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

15
ответ дан 5 December 2019 в 05:25
поделиться

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

7
ответ дан 5 December 2019 в 05:25
поделиться

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

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

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

9
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: