簡體   English   中英

如何有條件地包含Perl模塊和庫,以及它們的全局變量

[英]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 $VarModule::One our $Var ,但請參閱以下注釋。

一般而言,從模塊中導出全局變量並不是一個好習慣,因為它會侵蝕整體設計,通過糾纏所謂的不同組件並繞過它們的接口。 它也可能導致細微且難以發現的問題。

有條件地使用全局變量似乎很奇怪:如果它們可能不存在,你如何使用它們? 這可能是一個令人困惑的設計,可能會改變。

暫無
暫無

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

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