gpt4 book ai didi

perl - 如何在 BEGIN block 中使用外部库

转载 作者:行者123 更新时间:2023-12-04 18:24:22 25 4
gpt4 key购买 nike

我想在 BEGIN 中使用外部库Perl 脚本 block 。
我做的第一个测试是检查我的@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/';

现在我想在 push 之后导入一个模块:
use strict;
use warnings;

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

use Data::Dumper;
print Dumper @INC;
use ExtScript;
}

接下来的错误告诉我 @INC未更新: Can't locate ExtScript.pm in @INC (@INC contains: D:/perl/5163/site/lib
D:/perl/5163/lib .) at file.pl line 9.
BEGIN failed--compilation aborted at file.pl line 9.

为什么 @INC它不更新?
我无法在 BEGIN 中导入模块堵塞?还是对 Perl 的误用?

最佳答案

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

BEGIN {
push @INC, "some/dir";
use Example;
}

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

所以 Example模块将在 push 之前导入运行。

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

最简单的方法是只放置 @INC操作到 BEGIN block 中,并将模块导入外部:
BEGIN { push @INC, "some/dir" }
use Example;

更好的解决方案是使用 lib处理的编译指示 @INC :
use lib "some/dir";
use Example;

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

关于perl - 如何在 BEGIN block 中使用外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46214334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com