Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在BEGIN块中使用外部库_Perl - Fatal编程技术网

Perl 如何在BEGIN块中使用外部库

Perl 如何在BEGIN块中使用外部库,perl,Perl,我想在Perl脚本的BEGIN块中使用外部库。 我做的第一个测试是检查如果我推一些值,我的@INC是否会受到欢迎: use strict; use warnings; BEGIN { push @INC, "d:/external_pm/"; use Data::Dumper; print Dumper @INC; } 它按预期工作,并显示: $VAR1 = 'D:/perl/5163/site/lib'; $VAR2 = 'D:/perl/5163/lib'; $

我想在Perl脚本的
BEGIN
块中使用外部库。 我做的第一个测试是检查如果我推一些值,我的
@INC
是否会受到欢迎:

use strict;
use warnings;

BEGIN {
    push @INC, "d:/external_pm/";

    use Data::Dumper;
    print Dumper @INC;
}
它按预期工作,并显示:

$VAR1 = 'D:/perl/5163/site/lib';
$VAR2 = 'D:/perl/5163/lib';
$VAR3 = '.';  # I am not sure about this one?!
$VAR4 = 'd:/external_pm/';
现在,我想在按下
按钮之后立即导入一个模块:

use strict;
use warnings;

BEGIN {
    push @INC, "d:/external_pm/";

    use Data::Dumper;
    print Dumper @INC;
    use ExtScript;
}
下面的错误显示,
@INC
未更新:
在@INC(@INC包含:D:/perl/5163/site/lib)中找不到ExtScript.pm
D:/perl/5163/lib。),位于file.pl第9行。
BEGIN失败--编译在file.pl第9行中止。

为什么
@INC
没有更新?
我无法导入
开始
块中的模块?或者是错误使用Perl?

使用ExtScript
push@INC
之前执行。或者

  • 移动
    使用ExtScript退出
    开始
  • 或者将其更改为
    require
    /
    import
  • 或者使用
    -I
    命令行选项或
    PERL5LIB
    env变量

use
语句在编译时执行(特别是在开始阶段),而普通代码稍后运行。让我们看一下这个简化的片段:

BEGIN {
  push @INC, "some/dir";
  use Example;
}
如果我们明确说明所有阶段,则相当于:

BEGIN {
  push @INC, "some/dir";
  BEGIN { require Example; Example->import() }
}
因此,
示例
模块将在
推送
运行之前导入

有很多方法可以解决这个问题

最简单的方法是只将
@INC
操作放入BEGIN块,然后将模块导入外部:

BEGIN { push @INC, "some/dir" }
use Example;
更好的解决方案是使用
lib
pragma来处理
@INC

use lib "some/dir";
use Example;

但是,有一个主要区别:
use lib
在模块搜索路径的开头放置其他目录,因此您可能会意外地覆盖其他模块
push@INC
仅将目录添加到末尾,如果在其他位置找不到模块,则将其作为后备方案。

是否应
使用外部\u pm您的pm文件和目录应与您的模块名称匹配。您的外部模块位于何处?假设它在lib/ExtScript.pm下,您可以运行主脚本,如:perl-Ilib main。pl@GerhardBarnard它只是一个包含脚本的文件夹,因此文件夹名称与sript名称不匹配。@mabe02路径为
D:/external\u pm/ExtScript.pm
。这就是为什么我推送目录
D:/external\u-pm
并尝试使用
ExtScript.pm
提示:如果
D:/external\u-pm/
有您想让所有脚本都可以访问的模块,我会在这种情况下设置env var PERL5LIB。(右键点击我的电脑|属性|高级|环境变量)感谢您的详细解释!谢谢你的回答!