從指定模組匯入一些語意到目前套件中,通常是透過將特定子常式或變數名稱別名到您的套件中。它與以下完全相同
BEGIN { require Module; Module->import( LIST ); }
除了模組 必須 是單字外。匯入可以使用 if 模組進行條件設定。
BEGIN
強制 require
和 import
在編譯時發生。require
確保模組已載入記憶體中(如果尚未載入)。import
不是內建函式;它只是一個普通的靜態方法呼叫,呼叫到 Module
套件中,以告知模組將功能清單匯入回目前套件中。模組可以依任何它喜歡的方式實作其 import
方法,儘管大多數模組只選擇透過繼承自 Exporter
模組中定義的 Exporter
類別來衍生其 import
方法。請參閱 Exporter。如果找不到 import
方法,則會略過呼叫,即使有 AUTOLOAD 方法也是如此。
如果您不想要呼叫套件的 import
方法(例如,為了防止您的命名空間被變更),請明確提供空清單
use Module ();
這完全等同於
BEGIN { require Module }
如果 VERSION 引數存在於 Module 和 LIST 之間,則 use
會以給定的版本作為引數呼叫 Module 類別中的 VERSION
方法
use Module 12.34;
等同於
BEGIN { require Module; Module->VERSION(12.34) }
從 UNIVERSAL
類別繼承而來的 預設 VERSION
方法,如果給定的版本大於變數 $Module::VERSION
的值,則會中斷。
VERSION 引數不能是任意表達式。它只有在版本號碼字面值時才算作 VERSION 引數,以數字或 v 開頭,後接數字。任何看起來不像版本字面值的東西都將被解析為 LIST 的開頭。儘管如此,許多嘗試將任意表達式用作 VERSION 引數的嘗試似乎都能成功,因為 Exporter 的 import
方法會特別處理數字引數,執行版本檢查,而不是將它們視為要匯出的內容。
同樣地,省略 LIST(import
沒有引數呼叫)和明確的空 LIST ()
(未呼叫 import
)是有區別的。請注意,VERSION 後面沒有逗號!
由於這是一個開放式介面,所以實用程式(編譯器指令)也是這樣實作的。目前實作的一些實用程式如下
use constant;
use diagnostics;
use integer;
use sigtrap qw(SEGV BUS);
use strict qw(subs vars refs);
use subs qw(afunc blurfl);
use warnings qw(all);
use sort qw(stable);
其中一些偽模組將語意匯入當前的區塊範圍(例如 strict
或 integer
,與將符號匯入當前套件的普通模組不同(在檔案結束時有效))。
由於 use
在編譯時生效,因此它不尊重正在編譯的程式碼的普通流程控制。特別是,將 use
放在條件式的 false 分支中並不會阻止它被處理。如果模組或實用程式只需要有條件載入,則可以使用 if 實用程式來完成
use if $] < 5.008, "utf8";
use if WANT_WARNINGS, warnings => qw(all);
有一個對應的 no
宣告,它會取消 use
匯入的意義,也就是說,它會呼叫 Module->unimport(LIST)
而不是 import
。它的行為與 import
對 VERSION、省略或空 LIST 或找不到 unimport 方法時一樣。
no integer;
no strict 'refs';
no warnings;
請參閱 perlmodlib 以取得標準模組和實用的清單。請參閱 perlrun 以取得 Perl 的 -M
和 -m
命令列選項,這些選項提供 use
功能,可從命令列取得。
以詞法方式啟用 feature 實用程式定義的已請求版本中可用的所有功能,並停用已請求版本功能組中不存在的任何功能。請參閱 feature。
VERSION 可以是 v 字串,例如 v5.24.1,將與 $^V
(又稱 $PERL_VERSION)進行比較,也可以是 5.024001 形式的數字引數,將與 $]
進行比較。如果 VERSION 大於目前 Perl 詮譯器的版本,則會引發例外狀況;Perl 不會嘗試剖析檔案的其餘部分。與 require
進行比較,它可以在執行時執行類似的檢查。
如果指定的 Perl 版本為 5.12 或更高,則會以詞法方式啟用約束,就像 use strict
一樣。類似地,如果指定的 Perl 版本為 5.35.0 或更高,則會啟用 warnings。稍後使用 use VERSION
會覆寫先前 use VERSION
的所有行為,可能會移除它所新增的 strict
、warnings
和 feature
。use VERSION
不會載入 feature.pm、strict.pm 或 warnings.pm 檔案。
在目前的實作中,任何明確使用 use strict
或 no strict
的情況都會覆寫 use VERSION
,即使它出現在 use VERSION
之前。但是,這可能會在未來的 Perl 版本中變更,因此新的程式碼不應依賴此事實。建議將 use VERSION
宣告設為檔案中的第一個重要陳述(可能在 package
陳述或任何空白或註解之後),以便其效果首先發生,而其他實用程式會在它之後套用。
通常應避免將 VERSION 指定為 5.024001 形式的數字引數,因為與 v5.24.1 相比,它較舊且較難閱讀。在 2002 年發布 perl 5.8.0 之前,較冗長的數字形式是唯一支援的語法,這就是為什麼您可能在較舊的程式碼中看到它。
use v5.24.1; # compile time version check
use 5.24.1; # ditto
use 5.024_001; # ditto; older syntax compatible with perl 5.6
如果您需要在使用與舊版 Perl 不相容的函式庫模組之前檢查目前的 Perl 版本,這通常很有用。(我們盡量避免這麼做。)
相對地,no VERSION
讓您可以指定您要比指定版本更舊的 Perl 版本。這在 Raku 語言(以前稱為「Perl 6」)的早期設計中加入,讓 Perl 5 程式可以開始
no 6;
宣告它不是 Perl 6 程式。由於這兩種語言有不同的實作、檔案命名慣例和其他基礎架構,這個功能現在在實務上很少使用,在撰寫新程式碼時應避免使用。
使用 no VERSION
表單時應小心,因為它只用於宣告執行的 Perl 版本早於其引數,而非用於取消 use VERSION
的功能啟用副作用。