[英]How to include conditionally Perl modules and libraries, as well as Global variables from them
我正在開發一個Perl腳本。 在里面我用各種各樣的moudules:
use Module::One;
use Module::Two;
...
我還使用這些模塊中的全局變量:
$GLOBAL_1 = 1;
$GLOBAL_2 = 1;
...
假設腳本的名稱是
my_script.pl
是否有可能在向腳本傳遞一個名為'no_libs'的參數時有條件地包含上述模塊和全局變量,但是每當不傳遞這個參數時 - 不包括或使用它們? 像這樣的東西:
perl my_cript.pl no_libs
if ( $ARGV[0] eq 'no_libs' ) {
use Module::One;
use Module::Two;
...
$GLOBAL_1 = 1;
$GLOBAL_2 = 1;
...
}
我希望示例$ARGV[0] eq '...'
真正代表更多涉及的命令行參數處理,包括對變量的賦值等。 然后這發生在運行時,你不能use
這種方式use
條件,因為它在編譯時運行。
所述示例在編譯時工作,在這種情況下使用if pragma
use if @ARGV && ($ARGV[0] eq 'no_libs'), Module::One, qw(...);
如果條件為真,則與use Module::One qw(...)
具有相同的效果。
如果決定確實在運行時發生,那么您需要使用require
if ($no_libs) {
require Module::One;
Module::One->import( qw(f1 f2) ); # as in: use Module::One qw(f1 f2);
...
}
該應用可以歸結為require
,因為use Module LIST;
完全是指
BEGIN { require Module; Module->import( LIST ); }
所以你在運行時幾乎一樣。
但是,全局變量不能以這種方式導入,因為strict
不會及時聲明它們。 感謝ikegami的評論。 您可以直接將它們用作$Module::One::Var
,對於our $Var
在Module::One
our $Var
,但請參閱以下注釋。
一般而言,從模塊中導出全局變量並不是一個好習慣,因為它會侵蝕整體設計,通過糾纏所謂的不同組件並繞過它們的接口。 它也可能導致細微且難以發現的問題。
有條件地使用全局變量似乎很奇怪:如果它們可能不存在,你如何使用它們? 這可能是一個令人困惑的設計,可能會改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.