簡體   English   中英

如何在運行時在 Perl 中加載模塊?

[英]How do I load a module at runtime in Perl?

是否可以在 Perl 中在運行時加載模塊? 我嘗試了以下方法,但沒有奏效。 我在程序的某處寫了以下內容:

require some_module;
import some_module ("some_func");
some_func;

foo.pm

package Foo;

use strict;
use warnings;

use Exporter qw(import);
our @EXPORT = qw(bar);

sub bar { print "bar(@_)\n" }

1;

腳本文件

use strict;
use warnings;

require Foo;
Foo->import('bar');
bar(1, 22, 333);

最簡單的方法可能是使用像Module::Load這樣的模塊

use Module::Load;
load Data::Dumper;

看看這個“如何動態加載模塊”,你也可以看看Programming Perl中的[DynaLoader - Automatic Dynamic Loading of Perl Modules]。

給定包的名稱,將其用作userequire的裸詞:

use Some::Module;
require Some::Module;

要導入符號,您可以提供要use其他參數(如果沒有參數,它會導入包定義的所有默認符號):

use Some::Module qw(func1 func2 ...)

使用require您必須自己調用 import :

require Some::Module;
Some::Module->import( qw(func1 func2 ...) );

您將在use docs 中看到它是在編譯時發生的一種奇特的require形式:

BEGIN { require Module; Module->import( LIST ); }

現在,這就是大多數模塊大部分時間的加載方式。 當人們提前不知道包裹的名稱時,會出現另一個答案。

鑒於某些包名稱是一個字符串,您可以做各種事情。 其他答案中提到的各種模塊只是為你做這件事。

require可以在eval做到這一點:

eval "require $class" or die ...;

人們對eval感到緊張,因為很容易在$class出現任何東西,而且它們可能會運行意外的代碼。 但是,這就是便利模塊通常最終為您做的事情,包含在一些健全性檢查中。

除此之外,您可以將類名轉換為文件名。 Perl 5 就是這么簡單,因為::成為目錄分隔符,並且您在末尾添加了一個.pm 然后,您可以將該文件名指定為require ,它會在@INC查找它:

# sanity check, moderately restrictive
die "Bad name!" unless m/\A [A-Za-z0-9_]+ (::[A-Za-z0-9_])* \z/x;
my $filename = "$class.pm";
$filename =~ s/::/\//g;
require $filename;

你可能不想自己做這項工作,因為它很容易搞砸,而且使用另一個模塊可能不是問題。 然而,有時添加另一個第三方依賴項的重量是不值得的。 這是一個不同的問題,其答案取決於當地情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM