【问题标题】:perl module eval issues with qwqw 的 perl 模块评估问题
【发布时间】:2013-07-24 15:09:29
【问题描述】:

如果在运行脚本时缺少模块,我会尝试为应用程序提供“人类可读的消息”。但是,在使用 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.

使用 use 显然不起作用,因为它会给出正常的错误消息

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.

在裸词中添加 * 也无济于事,因为它只使用一次,会引发另一个错误并出现使用警告;

当模块可以成功加载时,是否有相同的方法可以解决此问题以使 BAREWORDS 正常工作?

【问题讨论】:

  • 我无法重现这个。你在哪个 Perl 版本/平台上?拨打Proc::Daemon->import("SOCK_STREAM","SOMAXCONN")可以吗?

标签: perl module require


【解决方案1】:

问题是您在编译使用它的代码后加载该模块。当你这样做时,你不能使用从模块中导入的函数作为裸词。


使用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"); 
    }
}

【讨论】:

  • @ysth,哎呀,应该是原型。固定。
【解决方案2】:

对于运行时的use,使用字符串评估,而不是块评估,因为在编译时遇到的任何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

【讨论】:

  • 帮不上忙。在与以前完全相同的时间执行完全相同的操作。
猜你喜欢
  • 2013-09-15
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2013-11-04
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多