2013-07-24 46 views
0

我想为应用程序提供“人类可读的消息”,如果在运行脚本时缺少模块。然而,我偶然发现了用qw加载模块的问题。perl模块与qw的eval问题

我已经试过如下:

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

的问题是,你y之后加载模块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 ::守护的东西给自己的模块

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

@ysth,哎呀,应该是一个原型。固定。 – ikegami