gpt4 book ai didi

Perl `use qw` 或从 pm 文件导入子程序

转载 作者:行者123 更新时间:2023-12-02 15:26:39 25 4
gpt4 key购买 nike

我有一个 perl 模块 .pm 文件,其中包含我的子例程,它看起来像这样:

package test;
use strict;
use vars qw($VERSION @ISA @EXPORT $ERROR $NAME);
require Exporter;
@ISA = qw(Exporter);
@EXPORT = (
sub1
sub2
err1
err2
);
#...etc...

现在我有一个 pl 文件,需要导入子程序,但不是每个子程序,只要它们在配置列表中。例如:

@subs = ('sub1', 'sub2'); # need to load sub1 & sub2, but do not load err1 & err2

@subs = ('sub1', 'err1'); # need to load sub1 & err1, but do not load sub2 & err2

我该怎么做?

我尝试这样做,但没有成功:

my @subs = ('sub1', 'sub2');
use test @subs;

有没有办法只加载需要的功能?需要的是从 SQL 或配置文件或任何其他方式读取...

最佳答案

你的代码的原因:

my @subs = ('sub1', 'sub2');
use test @subs;

不起作用的是 use语句在解析期间立即评估,(几乎)在任何其他代码之前。因此,您的代码的第二行实际上第一行之前运行,因此 @subs 在那一点上仍然是空的。

工作:

my @subs;
BEGIN { @subs = ('sub1', 'sub2'); }
use test @subs;

就像这样:

BEGIN {
my @subs = ('sub1', 'sub2');
require test;
test->import(@subs);
}

在以前的版本中,BEGIN block 用于在解析期间对@subs 进行赋值;在第二个版本中,整个代码都放在 BEGIN block 中,use 语句被替换为运行时等效语句(require + 导入).


但是,您可能一开始就没有任何理由这样做。当你载入一个模块时,所有它的代码都会被载入,* 所以你实际上并没有通过导入模块提供的一些功能来节省任何内存。事实上,不导入模块提供的所有内容的唯一真正原因是避免可能试图导出具有相同名称或您自己的函数的模块之间的冲突。

在任何情况下,总是可以*调用模块中的函数而无需导入它们,只需在它们前面加上模块名称和:: 前缀。所以,而不是:

use test qw(foo bar);
foo();
bar();

你可以这样做:

use test ();
test::foo();
test::bar();

*) 从技术上讲,在 Perl 中保证的东西很少,并且一个模块很可能实现某种只创建函数的延迟加载机制(或者导入它们时从另一个模块加载它们)。但这需要一个自定义的import(和/或AUTOLOAD)方法;对于使用 Exporter 的普通模块,上面的简化描述是正确的。

关于Perl `use qw` 或从 pm 文件导入子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30017404/

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