內容

名稱

version - Perl 擴充套件,用於版本物件

語法

# Parsing version strings (decimal or dotted-decimal)

use version 0.77; # get latest bug-fixes and API
$ver = version->parse($string)

# Declaring a dotted-decimal $VERSION (keep on one line!)

use version; our $VERSION = version->declare("v1.2.3"); # formal
use version; our $VERSION = qv("v1.2.3");               # deprecated
use version; our $VERSION = qv("v1.2_3");               # deprecated

# Declaring an old-style decimal $VERSION (use quotes!)

our $VERSION = "1.0203";                                # recommended
use version; our $VERSION = version->parse("1.0203");   # formal
use version; our $VERSION = version->parse("1.02_03");  # alpha

# Comparing mixed version styles (decimals, dotted-decimals, objects)

if ( version->parse($v1) == version->parse($v2) ) {
  # do stuff
}

# Sorting mixed version styles

@ordered = sort { version->parse($a) <=> version->parse($b) } @list;

說明

版本物件已在 Perl 5.10 中新增。此模組為舊版 Perl 實作版本物件,並提供所有 Perl 版本的版本物件 API。所有 0.74 之前的舊版本都已過時,且不應使用,因為 API 變更不相容。版本 0.77 引進新的「剖析」和「宣告」方法,以標準化用法。強烈建議您在程式碼中將 0.77 設為最低版本,例如:

use version 0.77; # even for Perl v.5.10.0

版本物件的類型

有兩種不同類型的版本物件,對應於兩種不同的版本樣式

十進制版本

經典的浮點數 $VERSION。這種樣式的優點是您不需要做任何特殊的事情,只需在您的原始檔中輸入一個數字。建議使用引號,因為它可以確保尾數零(「1.50」)保留在任何警告或其他輸出中。

點分十進制版本

更現代的版本指定形式,有 3 個(或潛在更多)整數,以小數點分隔(例如 v1.2.3)。這是 Perl 自 5.6.0 發布以來一直使用的形式。現在強烈建議使用前導「v」以提高清晰度,如果省略,將在未來的版本中發出警告。通過 「is_strict()」 測試需要前導「v」字元。

宣告版本

如果您有一個使用十進制 $VERSION(浮點數)的模組,並且您不打算更改它,那麼這個模組不適合您。version.pm 沒有比簡單的 $VERSION 指定獲得更多的好處

our $VERSION = "1.02";

由於 Perl v5.10.0 無論如何都包含 version.pm 比較邏輯,因此您不需要做任何事情。

如何將模組從十進制轉換為點分十進制

如果您過去使用過十進制 $VERSION 並希望切換到點分十進制 $VERSION,那麼您需要對新格式進行一次性轉換。

重要注意事項:您必須確保您的新 $VERSION 在數值上大於您目前的十進制 $VERSION;這並不總是顯而易見的。首先,將您的舊十進制版本(例如 1.02)轉換為正規化的點分十進制形式

$ perl -Mversion -e 'print version->parse("1.02")->normal'
v1.20.0

然後遞增任何點分十進制組件(v1.20.1 或 v1.21.0)。

如何 declare() 一個點分十進制版本

use version; our $VERSION = version->declare("v1.2.3");

declare() 方法總是建立點分十進制版本物件。在模組中使用時,您必須將其放在與「use version」相同的行上,以確保 PAUSE 和安裝工具正確讀取 $VERSION。您還應該將「version」新增到模組元資料檔的「configure_requires」區段。有關詳細資訊,請參閱 ExtUtils::MakeMakerModule::Build 中的說明。

重要注意事項:即使您傳入看起來像小數的數字(「1.2」),也會建立一個點分十進制數字(「v1.200.0」)。為避免混淆或在較舊的 Perl 中發生意外錯誤,請遵循下列準則

如果您真的堅持要將 version.pm 與一般十進制版本搭配使用,請使用 parse(),而非宣告。有關詳細資訊,請參閱「剖析和比較版本」

另請參閱 version::Internals,以進一步了解版本號碼轉換、引用、計算的版本號碼,以及宣告開發人員或「alpha」版本號碼。

剖析和比較版本

如果您需要比較版本號碼,但無法確定它們是以數字、字串、v 字串或版本物件表示,則應使用 version.pm 將它們全部剖析為物件,以進行比較。

如何 parse() 版本

parse() 方法會接收任何可能是版本的內容,並傳回對應的版本物件,並在過程中執行任何必要的轉換。

一些範例

$variable   version->parse($variable)
---------   -------------------------
1.23        v1.230.0
"1.23"      v1.230.0
v1.23       v1.23.0
"v1.23"     v1.23.0
"1.2.3"     v1.2.3
"v1.2.3"    v1.2.3

有關版本號碼轉換的更多資訊,請參閱 version::Internals

如果您不想實際建立一個完整的版本物件,但仍想驗證給定的字串是否符合剖析為版本的條件,則有兩個輔助函式可以直接使用

is_lax()

寬鬆條件對應於版本剖析器目前允許的內容。下列所有格式都可接受,用於點分十進制格式的字串

v1.2
1.2345.6
v1.23_4
1.2345
1.2345_01
is_strict()

如果您想將自己限制在更狹義的版本字串定義中,is_strict() 會限制在類似下列清單的版本字串

v1.234.5
2.3456

請參閱 version::Internals,以了解定義合法版本字串形式的正規表示式的詳細資料,以及如果 is_lax()is_strict() 不足以滿足您的需求,如何在自己的程式碼中使用這些正規表示式。

如何比較版本物件

版本物件會覆寫 cmp<=> 算子。Perl 會根據這兩個算子自動產生所有其他比較算子,因此所有正常的邏輯比較都會運作。

if ( version->parse($v1) == version->parse($v2) ) {
  # do stuff
}

如果版本物件與非版本物件進行比較,非物件項目將使用 parse() 轉換為版本物件。這可能會產生令人驚訝的結果

$v1 = version->parse("v0.95.0");
$bool = $v1 < 0.94; # TRUE since 0.94 is v0.940.0

始終與版本物件進行比較將有助於避免驚喜

$bool = $v1 < version->parse("v0.94.0"); # FALSE

請注意,「alpha」版本物件(版本字串包含尾隨底線區段)的比較結果小於沒有底線的等效版本

$bool = version->parse("1.23_45") < version->parse("1.2345"); # TRUE

請參閱 version::Internals 以取得有關「alpha」版本的更多詳細資料。

物件方法

is_alpha()

如果且僅如果版本物件是用底線建立的,則為 True,例如

version->parse('1.002_03')->is_alpha;  # TRUE
version->declare('1.2.3_4')->is_alpha; # TRUE

is_qv()

如果且僅如果版本物件是點分十進位版本,則為 True,例如

version->parse('v1.2.0')->is_qv;       # TRUE
version->declare('v1.2')->is_qv;       # TRUE
qv('1.2')->is_qv;                      # TRUE
version->parse('1.2')->is_qv;          # FALSE

normal()

傳回一個字串,其標準「正規化」點分十進位形式具有前導 v 和至少 3 個組成部分。

version->declare('v1.2')->normal;  # v1.2.0
version->parse('1.2')->normal;     # v1.200.0

numify()

傳回一個值,表示物件中的純十進位數。

version->declare('v1.2')->numify;  # 1.002000
version->parse('1.2')->numify;     # 1.200

stringify()

傳回一個字串,其盡可能接近原始表示。如果原始表示是數字文字,則會以 perl 通常在字串中表示它的方式傳回。每當版本物件內插到字串中時,都會使用此方法。

version->declare('v1.2')->stringify;    # v1.2
version->parse('1.200')->stringify;     # 1.2
version->parse(1.02_30)->stringify;     # 1.023

匯出的函式

qv()

不再建議使用此函式,但會維護以與現有程式碼相容。如果您不希望將它匯出到您的命名空間,請使用此表單

use version 0.77 ();

is_lax()

(預設不匯出)

此函式會接收一個純量引數,並傳回一個布林值,表示引數是否符合版本號碼的「寬鬆」規則。不允許有前導和尾隨空白。

is_strict()

(預設不匯出)

此函式會接收一個純量引數,並傳回一個布林值,表示引數是否符合版本號碼的「嚴格」規則。不允許有前導和尾隨空白。

作者

John Peacock <jpeacock@cpan.org>

另請參閱

version::Internals.

perl.