$VERSION = eval $VERSION;の意味
$VERSION = eval $VERSION;? - ヒルズで働く@robarioの技ログについて。
Perlでは数値に_(アンダースコア)を入れることが出来ます。これは単に見易さのためです。
参考:Perl::Critic::Policy::ValuesAndExpressions::RequireNumberSeparators - Write 141_234_397.0145 instead of 141234397.0145 . - metacpan.org
Numeric Versions形式でαバージョンを表す場合、アンダースコアを使って
1.12_01
のように書きますが、これは数値コンテキストでは
1.1201
と全く同じ意味になり、αバージョンの情報が欠落してしまいます。
以下の例ではαバージョンがあったのかどうか分かりませんが、
our $VERSION = 1.12_01; print Dump($VERSION); # SV = NV(0x68b3a0) at 0x67ee50 # REFCNT = 1 # FLAGS = (NOK,pNOK) # NV = 1.1201
文字列にしておけば元の値を保持しておくことができます。
our $VERSION = '1.12_01';
$VERSION = eval $VERSION;
print Dump($VERSION);
# SV = PVNV(0x664910) at 0x67ee50
# REFCNT = 1
# FLAGS = (NOK,pNOK)
# IV = 0
# NV = 1.1201
# PV = 0x675b00 "1.12_01"\0
# CUR = 7
# LEN = 8
わざわざevalでNVも格納しているのは、アンダースコアが付いている(αバージョンが付いている)と数値への自動変換が行なわれないので、数値コンテキストで比較に失敗するからです。
% perl -Mwarnings -e '$VERSION="1.12_01"; print 1.12 < $VERSION' Argument "1.12_01" isn't numeric in numeric lt (<) at -e line 1. % perl -Mwarnings -e '$VERSION="1.12_01"; $VERSION=eval $VERSION; print 1.12 < $VERSION' 1
まぁversion.pm使っとけという話ではありますが。