use 模組 VERSION 清單
use 模組 VERSION
use 模組 清單
use 模組

從指定模組匯入一些語意到目前套件中,通常是透過將特定子常式或變數名稱別名到您的套件中。它與以下完全相同

BEGIN { require Module; Module->import( LIST ); }

除了模組 必須 是單字外。匯入可以使用 if 模組進行條件設定。

BEGIN 強制 requireimport 在編譯時發生。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 引數的嘗試似乎都能成功,因為 Exporterimport 方法會特別處理數字引數,執行版本檢查,而不是將它們視為要匯出的內容。

同樣地,省略 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);

其中一些偽模組將語意匯入當前的區塊範圍(例如 strictinteger,與將符號匯入當前套件的普通模組不同(在檔案結束時有效))。

由於 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 功能,可從命令列取得。

use VERSION

以詞法方式啟用 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 的所有行為,可能會移除它所新增的 strictwarningsfeatureuse VERSION 不會載入 feature.pmstrict.pmwarnings.pm 檔案。

在目前的實作中,任何明確使用 use strictno 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 的功能啟用副作用。