В Perl, в чем разница между использованием и требованием для загрузки модуля? - PullRequest
27 голосов
/ 22 июля 2009

В чем разница между use My::Module и require My::Module?

Ответы [ 4 ]

30 голосов
/ 22 июля 2009

Функция use:

use ModuleName;

эквивалентен следующему коду с использованием функции require:

BEGIN {
    require ModuleName;
    ModuleName->import;
}

Блок BEGIN запускает этот код, как только анализатор его видит. require загружает модуль или die с. И тогда вызывается функция import модуля. Функция import может делать все что угодно, но обычно она загружает функции в пространство имен, use d (часто с модулем Exporter).

Важно отметить, что импорт не будет вызываться в этом случае:

use ModuleName ();

В этом случае это эквивалентно

BEGIN {
    require ModuleName;
}
17 голосов
/ 22 июля 2009

От perldoc -q «разница между потребностью и использованием» :

use Module похоже на require Module, за исключением того, что use

4.1: загрузка модуля во время компиляции, а не во время выполнения.

4.2: импортирует символы и семантику из этого пакета в текущий.

10 голосов
/ 22 июля 2009

Perl поставляется с отличной документацией. Каждый может извлечь пользу из прочтения всей документации по крайней мере раз в несколько месяцев.

C:\> perldoc -f require

В противном случае require требует, чтобы файл библиотеки был включается, если это еще не было включен. Файл включен через механизм do-FILE, который по сути просто разнообразие Eval с оговоркой, что лексические переменные в вызывающем скрипте будет невидимый для включенного кода. имеет семантика похожа на следующую подпрограмма:

... и т. Д. Аналогично,

C:\> perldoc -f use

Импортирует некоторую семантику в текущий пакет из названного модуля, как правило, псевдонимы определенных имена подпрограмм или переменных в вашем пакет. Это в точности эквивалентно

BEGIN { require Module; Module->import( LIST ); }

за исключением того, что модуль должен быть голым.

... и т. Д.

Существует также запись perlfaq , хотя я думаю, что она менее информативна, чем приведенная выше.

7 голосов
/ 22 июля 2009

use выполняется во время компиляции, а require выполняется во время выполнения.

...