[英]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]。
給定包的名稱,將其用作use
或require
的裸詞:
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.