Вы можете создать собственную проверку, используя a BEGIN
block. Они запускаются во время компиляции, как и use
. Имейте в виду, что use Foo
не по существу ничто иное, как это:
BEGIN {
require Foo;
Foo->import;
}
Следующий код заменит все use
заявления с одним BEGIN
и поместить их внутри eval
. Это по существу похоже на механизм try/catch.
Нам нужна строка eval
(которая считается злом здесь), потому что require
только преобразует из имен пакетов с двоеточием ::
к путям, если аргумент a bareword. Но поскольку у нас есть имя в $module
, это строка, поэтому нам нужно поместить ее в eval
согласно require
's docs.
Если эта строка eval
не работает, мы die
. Это поймано внешним блоком eval
и установлено [email protected]
. Затем мы можем проверить, содержит ли оно наше имя модуля, и в этом случае мы наивно предполагаем, что сбой был вызван тем, что этот модуль не установлен. Эта проверка может быть немного более сложной.
Мы отслеживаем любые сбои в $fails
, и если они были, остановимся.
#!/usr/bin/perl
use strict;
use warnings;
# all our use statements go here
BEGIN {
my $fails;
foreach my $module (qw/Digest::MD5 File::DosGlob ASDF/) {
eval {
eval "require $module" or die; # because $module is not a bareword
$module->import;
};
if ([email protected] && [email protected] =~ /$module/) {
warn "You need to install the $module module";
$fails++;
}
}
exit if $fails;
}
# ...
Выше я включил ASDF
, что у меня нет, поэтому при запуске он будет говорить
Вам необходимо установить модуль ASDF на /home/code/scratch.pl линии 1335.
Возможно, вы захотите сделать это сообщение более подробным. Если ваши пользователи не могут понять сообщение об ошибке по умолчанию, которое Perl дает, когда он не может найти модуль, возможно, было бы разумно включить руководство по установке материалов прямо там.
Обратите внимание, что оба модуля, которые вы указали, были включены в Perl для a while (читать: с марта 2002 года). Итак, почему вы хотите сделать это для этих модулей?
$ corelist Digest::MD5
Data for 2014-09-14
Digest::MD5 was first released with perl v5.7.3
$ corelist File::DosGlob
Data for 2014-09-14
File::DosGlob was first released with perl 5.00405
Лучше всего было бы отправить вашу программу в качестве распределения, который может быть установлен, и включают в Makefile или cpanfile или что-то подобное, в котором перечислены зависимости. Существует руководство в perlnewmod о том, как запустить новый модуль. Вы не хотите загружать в CPAN, очевидно, но основы одинаковы.
При этом ваши пользователи будут автоматически устанавливать все зависимости.
Спасибо, что упомянул _perlnewmod_. Я всегда задавался вопросом, как CPAN заселяется. – PerlDuck
Существует намного больше, чем просто doc @PerlDuck. Существуют различные инструменты для запуска новых дистрибутивов, а также несколько руководств. Возможно, сейчас самое подходящее время для выпуска чего-то на CPAN. Пойдите, сделайте учетную запись PAUSE. :) – simbabque
Я действительно не знаком с makefile или cpanfile, Begin работает для одного файла. Спасибо за это, но если я хочу проверить все файлы perl в папке, как это можно сделать – VSr