What's "integer"?

<追記>
id:tokuhiromによれば,これは10e100+0.1を整数として扱ってしまい,またマシンの制約上10e100と10e100+0.1を識別する方法はないため,良くないのではないかということだ。
よって,正規リリース後に詳細を追記する。
MouseのInt制約で,大きな整数が通らないというバグレポートをもらった*1
確かに,以下の数値は値としては整数だが,MooseにせよMouseにせよInt制約は通らない。

$ perl -E 'say 10e100' # 10後に0が100個並ぶ数
10e100
$ perl -Mouse
has value => (is => "rw", isa => "Int");
__PACKAGE__->new(value => 10e100);
__END__
Attribute (value) does not pass the type constraint because:
Validation failed for 'Int' failed with value 1e+101 at - line 5
$ perl -Moose
has value => (is => "rw", isa => "Int");
__PACKAGE__->new(value => 10e100);
__END__
Attribute (value) does not pass the type constraint because:
Validation failed for 'Int' failed with value 1e+101 at (snip)
$ 

解決策としては, Perl_fmod(value, 1) == 0(XSの場合)やPOSIX::fmod($value, 1) == 0(PPの場合)で解決できるようだ。

ところで,perlfaqには「How do I determine whether a scalar is a number/whole/integer/float?」というセクションがあるが,それによれば整数とは以下のように判別できるとある。

if (/^-?\d+$/)       { print "is an integer\n" }

MooseのInt制約や,Mouse::PurePerlのInt制約は実際にこのようになっている*2
しかし,これは10e100に対しては動かない。10e100は文字列として評価するとあくまでも"10e100"だからだ。整数かどうかを識別するためだけにPOSIXモジュールをロードするのも大げさだが,そういうものだと思って諦めるほかないのだろうか。

*1:Mouse 0.50_06で解決済み

*2:Moose 0.98, Mouse 0.50現在