$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使っとけという話ではありますが。