想象一下,我想在運行時加載模塊。我預計這工作無法在運行時加載`Cwd`(以及其他非核心模塊)
use warnings;
use strict;
eval {
require Cwd;
Cwd->import;
};
if ([email protected]) { die "Can't load Cwd: [email protected]" }
say "Dir: ", getcwd;
但它不,根據Bareword "getcwd" not allowed ...
。
Cwd默認出口getcwd
。我嘗試給函數名稱(s)import
,我嘗試了其他功能。 它適用於全名say Cwd::getcwd
,所以我認爲它不是導入。
這可以作爲嘗試了,我嘗試了一些其他的核心模塊,例如
use warnings;
use strict;
eval {
require List::Util;
List::Util->import('max');
};
if ([email protected]) { die "Can't load List::Util: [email protected]" }
my $max = max (1, 14, 3, 26, 2);
print "Max is $max\n";
注意補充 顯然,函數調用括號給出一個線索編譯器。但是,在我看來,問題仍然存在,最後請參閱編輯。另外,上述模塊中的first BLOCK LIST
等功能不起作用。
然而,不工作數(完善的)非核心,我試圖模塊。更糟和更容易混淆的是,即使使用完全限定名稱,它也不起作用。
如果在運行時使用require
,但我們可以想象在編譯時使用的符號(函數)是未知的,但它適用於(其他)核心模塊。我認爲這是在運行時加載的標準方式。
如果我需要動態加載時使用全名然後罰款,但與不一致的是什麼?以及如何做我在運行時加載(並使用)非核心模塊?
我也試過Module::Load::Conditional
,它沒有工作。
我錯過了什麼,以及如何在運行時加載模塊? (試圖與5.16
和5.10.1
。)
編輯
正如Matt Jacob指出,用括號作品通話,getcwd()
。但是,給定perlsub
NAME LIST;
#圓括號可選,如果預先聲明/導入。
這意味着導入不起作用,爲什麼仍然存在問題。
此外,必須根據模塊如何加載使用不同的語法並不好。另外,我不能讓非核心模塊以這種方式工作,特別是具有像List::MoreUtils這樣的語法的模塊。
Perl不知道它是一個子例程。你需要:'&getcwd'(不是很好),''使用subs qw(getcwd);'(更好),或者簡單地'getcwd()'(最好)。 –
@MattJacob謝謝,這確實有用。但是,問題仍然存在,正如我在最後添加的說明中所解釋的那樣。 – zdim
當getcwd調用被編譯時,導入還沒有起作用,所以你得到了嚴格的錯誤(或者沒有嚴格的錯誤,把它解釋爲字符串'「getcwd」')。添加圓括號告訴perl它是一個子調用,而不是一個單純的詞。 – ysth