модули Perl включает в себя подпрограмму. Обычно причиной использования модуля является использование подпрограмм из этого модуля. Модуль будет иметь свое собственное имя пакета, и подпрограммы из этого модуля будут существовать в этом пакете. Таким образом, простой модуль может выглядеть следующим образом:
package MyModule;
sub my_sub {
print "This is my sub\n";
}
Если я загрузить этот модуль в моем коде, то я должен вызвать подпрограмму, используя его полное имя (т.е. включая имя пакета).
use MyModule;
MyModule::my_sub();
Это получает повторяющиеся довольно быстро, так что многие модули будут экспорт их подпрограммами в ваш пакет. Они делают это с использованием специальных массивов, называемых @EXPORT
и @EXPORT_OK
.
Если я поместил имя подпрограммы в @EXPORT
, то он автоматически импортируется всякий раз, когда используется этот модуль.
package MyModule;
our @EXPORT = ('my_sub');
sub my_sub {
print "This is my sub\n";
}
можно затем использовать его как это:
use MyModule;
my_sub();
В качестве альтернативы, можно использовать @EXPORT_OK
, который определяет необязательный экспорт. Пользователи могут запрашивать подпрограммы в @EXPORT_OK
для импорта - но это происходит не автоматически. Вы запрашиваете экспорт опций для импорта, включая имя в заявлении use
.
package MyModule;
our @EXPORT_OK = ('my_sub');
sub my_sub {
print "This is my sub\n";
}
теперь я могу это сделать:
use MyModule ('my_sub');
my_sub();
Там еще один трюк, который может быть полезным. Вы можете отключить автоматический импорт с пустым списком в операторе use
. Предположим, что мы имеем версию @EXPORT
модуля:
use MyModule(); # Turn off imports
my_sub(); # Doesn't work
MyModule::my_sub(); # works
Теперь у нас есть знания, мы должны смотреть на вашей конкретной проблемы. Самое простое решение - отключить все автоматические импорт и использовать полностью квалифицированные имена обеих подпрограмм.
use CSS::Minifier();
use JavaScript::Minifier();
CSS::Minifier::minify();
JavaScript::Minifier::minify();
Но мы можем быть немного умнее. Документация для обоих модулей предполагает, что оба импорта являются необязательными, поэтому вам нужно явно импортировать подпрограммы.
use CSS::Minifier ('minify');
use JavaScript::Minifier('minify');
Это, очевидно, было бы плохо, потому что вы не можете импортировать две подпрограммы с тем же именем!
Однако, глядя на исходный код к модулям, я вижу, что документация для JavaScript :: Minifier неправильно (Edit: Я submitted a report об этой ошибке). CSS :: Minifier имеет следующую строку кода:
Но JavaScript :: Minifier имеет это:
our @EXPORT = qw(minify);
Так экспорт автоматически из JavaScript :: Minifier и опциональный из CSS :: Minifier. Таким образом, самый простой подход взять бы:
use JavaScript::Minifier; # Automatically imports minify
use CSS::Minifier; # Doesn't import option export minify
Вы могли бы использовать две подпрограммы, как это:
minify(); # Automatic export from JavaScript::Minifier
CSS::Minifier::minify(); # Fully-qualified name from CSS::Minifier
Подозреваю, однако, что это плохой подход, как это трудно быть уверенным, откуда берется безоговорочная версия minify()
. Поэтому я рекомендую отключить весь импорт из двух модулей и использовать полностью квалифицированные имена для обеих подпрограмм.
Спасибо за четкий и подробный ответ. Принимая это вместо этого. – Dayo