评估和使用的问题

时间:2011-11-29 00:40:33

标签: perl module detect strict bareword

我编写了这段代码,它在系统中安装POE模块时有效。

#!/usr/bin/perl

use strict;
use warnings;
use POE;

...

但我想确定这个模块是否存在:

#!/usr/bin/perl

use strict;
use warnings;
eval("use POE; 1") or die ('Please, install POE module. \n');

...

然后它返回:

Bareword "KERNEL" not allowed while "strict subs" in use at ./terminalhero.perl line 58.
Bareword "HEAP" not allowed while "strict subs" in use at ./terminalhero.perl line 60.
Execution of ./terminalhero.perl aborted due to compilation errors.

我尝试了其他模块,也有错误。如何使用严格模式做我想做的事?

1 个答案:

答案 0 :(得分:8)

问题是eval在编译时运行,但是在编译时检查了KERNELHEAP常量。所以你需要将你的eval放在BEGIN块中:

BEGIN {
    eval "use POE;";
    die "Unable to load POE: $@\n" if $@;
}

虽然这主要是徒劳无功,但如果无法加载您所请求的模块,标准use POE;也会因有用的错误而死亡。