2013-07-24 2 views
0

Я пытаюсь дать «человеко читаемое сообщение» для приложения, если отсутствуют недостающие модули при запуске скрипта. Однако я наткнулся на проблему, когда дело доходит до загрузки модулей с qw.perl модуль eval проблемы с qw

Я попытался следующие:

use strict; 
... 
if (! eval { require Proc::Daemon;1; }) { 
    push (@install_packages, "Proc::Daemon"); 
} else { 
    Proc::Daemon->import(qw(SOCK_STREAM SOMAXCONN)); 
} 

Однако он не

Bareword "SOCK_STREAM" not allowed while "strict subs" in use at ./revmon.pl line 144. 
Bareword "SOMAXCONN" not allowed while "strict subs" in use at ./revmon.pl line 144. 

Использование использования, очевидно, не работает, как это даст нормальный сообщения об ошибке

Can't locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) 
BEGIN failed--compilation aborted at ./revmon.pl line 11. 

Добавление * к головому слову ничем не помогает, так как он используется только один раз, что вызовет еще одну ошибку с использованием wa rnings;

Есть ли способ обойти это, чтобы заставить BAREWORDS работать правильно, когда модуль может быть загружен успешно?

+1

Я не могу воспроизвести это. Какую версию/платформу Perl вы используете? Он работает, если вы вызываете 'Proc :: Daemon-> import (" SOCK_STREAM "," SOMAXCONN ")'? – mob

ответ

1

проблема заключается в том, что вы загружаете модуль после того, как у ou скомпилируйте код, который его использует. Когда вы это делаете, вы не можете использовать функции, импортированные из модуля, как простые слова.


Использование SOCK_STREAM() и SOMAXCONN() отложит проверку на времени выполнения.

Или

BEGIN { 
    if (eval { require Proc::Daemon }) { 
     Proc::Daemon->import(qw(SOCK_STREAM SOMAXCONN)); 
    } else { 
     push(@install_packages, "Proc::Daemon"); 
     *SOCK_STREAM = sub() { die }; 
     *SOMAXCONN = sub() { die }; 
    } 
} 

Или переместить материал с помощью Proc :: Daemon его собственный модуль

if (eval { require Proc::Daemon }) { 
     require App::Proc::Daemon; 
     $handler = App::Proc::Daemon->new(); 
    } else { 
     push(@install_packages, "Proc::Daemon"); 
    } 
} 
+0

@ysth, oops, должен был быть прототипом. Исправлена. – ikegami

-1

Для use во время выполнения, используйте строку-Eval, а не блок-Eval, потому что любое use заявление встречается во время компиляции будут оценены во время компиляции

if (! eval "use Proc::Daemon qw(SOCK_STREAM SOMAXCONN); 1") { ... } 

Похожие вопросы:

How can I check if I have a Perl module before using it?

Perl - eval not trapping "use" statement

+1

Не собираюсь помогать. Выполняется точно так же, как и раньше. – ikegami

Смежные вопросы