在perl中运行时自动加载perl模块

在perl中运行时自动加载perl模块,perl,memory-management,Perl,Memory Management,有没有办法在Perl运行时加载整个模块?我原以为我找到了一个使用autouse的好解决方案,但以下代码编译失败: 包tryAutouse2 使用自动使用“tryAutouse” my$obj=tryAutouse->new() 我想这是因为autouse专门用于导出函数,对吗?由于编译失败,是否不可能有一个打包的解决方案?如果我想要动态加载,是否在每次调用新模块之前都必须要求 这背后的原因是我的团队加载了许多模块,但我们担心这会消耗内存 你想要或者 由于太多的魔力,为了方便起见,我只在REPL中

有没有办法在Perl运行时加载整个模块?我原以为我找到了一个使用
autouse
的好解决方案,但以下代码编译失败:

包tryAutouse2
使用自动使用“tryAutouse”
my$obj=tryAutouse->new()

我想这是因为
autouse
专门用于导出函数,对吗?由于编译失败,是否不可能有一个打包的解决方案?如果我想要动态加载,是否在每次调用新模块之前都必须
要求

这背后的原因是我的团队加载了许多模块,但我们担心这会消耗内存

你想要或者

由于太多的魔力,为了方便起见,我只在REPL中使用ClassLoader。对于严肃的代码,我总是明确地加载类。Jack Maney在评论中指出,和适用于延迟加载

eval 'use tryAutouse; 1;' or die $@;

会有用的。但是您可能想隐藏其丑陋之处。

require IMO没有问题。跳过函数的导出,只需调用完全限定的名称:

require Some::Module;
Some::Module::some_function(@some_arguments);
当你说:

use Foo::Bar;
您正在编译时加载模块
Foo::Bar
。因此,如果您想在运行时加载模块,可以使用
require

require Foo::Bar;
它们在某种程度上是等价的,但也有区别。请参阅上的Perldoc以了解完全不同之处。例如,以这种方式使用的
require
不会自动加载导入的函数。这可能对你很重要

如果要测试模块是否存在,请将
require
语句包装在
eval
中,并测试
eval
是否成功

我使用类似的技术来查看特定的Perl模块是否可用:

eval { require Mail::Sendmail; };
if ($@) {
    $watch->_Send_Email_Net_SMTP($watcher);
    return;
}
在上面,我将尝试使用
Mail::Sendmail
,这是一个可选模块(如果可用)。如果没有,我将运行另一个例程,该例程使用
Net::SMTP

sub _Send_Email_Net_SMTP {
    my $self    = shift;
    my $watcher = shift;

    require Net::SMTP;  #Standard module: It should be available

WORD O'WARNING:您需要在
eval
语句周围使用大括号,而不是括号。否则,如果
require
不起作用,您的程序将退出,这可能不是您想要做的。

指令“use”在编译时执行,因此检查模块的路径也会在编译时执行。这可能导致不正确的行为,除非您考虑@ INC数组的内容,否则难以理解。 一种解决方案是添加块“开始”,但下面显示的解决方案不美观

BEGIN { unshift @INC, '/path/to/module/'; }
use My::Module;
您可以用一个简单的指令替换整个混乱:

use lib '/path/to/module';
use My::Module;
这是因为它是在编译时执行的。所以一切都准备好执行“使用”指令了

除了“BEGIN”块,您还可以决定在编译时执行不同的指令,即声明一个常量

use constant LIB_DIR => '/path/to/module';
use lib LIB_DIR;
use My::Module;

你看过和吗?当编译失败时,你得到的错误信息是什么?@mob:你说得对。不会起作用,但会起作用。我会删除我的评论。这正是我想要的。谢谢