В чем разница между выполнением 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, за исключением того, чтоuse4.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 работает во время выполнения.