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::MakeMaker 或 Module::Build 中的說明。
重要注意事項:即使您傳入看起來像小數的數字(「1.2」),也會建立一個點分十進制數字(「v1.200.0」)。為避免混淆或在較舊的 Perl 中發生意外錯誤,請遵循下列準則
始終使用(至少)包含三個組件的點分十進制數字
始終使用前導 v
始終引用版本
如果您真的堅持要將 version.pm 與一般十進制版本搭配使用,請使用 parse()
,而非宣告。有關詳細資訊,請參閱「剖析和比較版本」。
另請參閱 version::Internals,以進一步了解版本號碼轉換、引用、計算的版本號碼,以及宣告開發人員或「alpha」版本號碼。
如果您需要比較版本號碼,但無法確定它們是以數字、字串、v 字串或版本物件表示,則應使用 version.pm 將它們全部剖析為物件,以進行比較。
parse()
版本parse()
方法會接收任何可能是版本的內容,並傳回對應的版本物件,並在過程中執行任何必要的轉換。
點分十進制數字:純粹的 v 字串(v1.2.3)和包含多個小數點且有前導「v」的字串(「v1.2.3」);請注意,技術上來說,您可以使用 v 字串或有前導 v 但只有一個小數點的字串(v1.2 或「v1.2」),但您會讓自己和其他人感到困惑。
十進制數字:一般十進制數字(字面值或字串中的數字)
一些範例
$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」版本的更多詳細資料。
如果且僅如果版本物件是用底線建立的,則為 True,例如
version->parse('1.002_03')->is_alpha; # TRUE
version->declare('1.2.3_4')->is_alpha; # TRUE
如果且僅如果版本物件是點分十進位版本,則為 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
傳回一個字串,其標準「正規化」點分十進位形式具有前導 v 和至少 3 個組成部分。
version->declare('v1.2')->normal; # v1.2.0
version->parse('1.2')->normal; # v1.200.0
傳回一個值,表示物件中的純十進位數。
version->declare('v1.2')->numify; # 1.002000
version->parse('1.2')->numify; # 1.200
傳回一個字串,其盡可能接近原始表示。如果原始表示是數字文字,則會以 perl 通常在字串中表示它的方式傳回。每當版本物件內插到字串中時,都會使用此方法。
version->declare('v1.2')->stringify; # v1.2
version->parse('1.200')->stringify; # 1.2
version->parse(1.02_30)->stringify; # 1.023
不再建議使用此函式,但會維護以與現有程式碼相容。如果您不希望將它匯出到您的命名空間,請使用此表單
use version 0.77 ();
(預設不匯出)
此函式會接收一個純量引數,並傳回一個布林值,表示引數是否符合版本號碼的「寬鬆」規則。不允許有前導和尾隨空白。
(預設不匯出)
此函式會接收一個純量引數,並傳回一個布林值,表示引數是否符合版本號碼的「嚴格」規則。不允許有前導和尾隨空白。
John Peacock <jpeacock@cpan.org>
perl.