В чем разница между выполнением use My::Module
и require My::Module
?
В Perl, в чем разница между использованием и требованием для загрузки модуля?
Ответ 1
Функция use
:
use ModuleName;
эквивалентен следующему коду с помощью функции require
:
BEGIN {
require ModuleName;
ModuleName->import;
}
Блок BEGIN
заставляет этот код запускаться, как только синтаксический анализатор видит его. require
загружает модуль или die
пытается. И затем вызывается функция import
модуля. Функция import
может делать всевозможные вещи, но для нее обычно загружать функции в пространство имен, которое use
d (часто с Exporter
).
Важно отметить, что импорт не будет вызываться в этом случае:
use ModuleName ();
В этом случае он эквивалентен
BEGIN {
require ModuleName;
}
Ответ 2
От perldoc -q
"разница между требованием и использованием" :
use Module
похож наrequire Module
, за исключением того, чтоuse
4.1: загружает модуль во время компиляции, а не во время выполнения.
4.2: импортирует символы и семантику из этого пакета в текущий.
Ответ 3
Perl поставляется с отличной документацией. Каждому было бы полезно прочитать всю документацию не реже одного раза в несколько месяцев.
C:\>
perldoc -f require
В противном случае
require
требует, чтобы файл библиотеки если он еще не был включен. Файл включен через do-FILE, который по существу, всего лишь множество с оговоркой, что лексические переменные в вызывающем script будет невидимый для включенного кода. имеет семантика, подобная следующей Подпрограмма:
... и т.д. Аналогично,
C:\>
perldoc -f use
Импортирует некоторую семантику в текущий пакет от именованного модуля, обычно путем наложения определенных подпрограммы или имена переменных в пакет. Это в точности эквивалентно
BEGIN { require Module; Module->import( LIST ); }
за исключением того, что модуль должен быть дельным.
... и т.д.
Существует также запись perlfaq, хотя я думаю, что она менее информативна, чем предыдущая.
Ответ 4
use
выполняется во время компиляции, а require
работает во время выполнения.