我注意到使用Readonly
模块声明的变量,多次评估一个变量会产生不同的结果。
>perl -Mbigint -MReadonly -wE "Readonly my $V => 1; foreach (1..2) { say 0 + '1000000000000001' * $V };
1000000000000000
1000000000000001
这是为什么?似乎第一次用字符串解释变量,第二次用数字上下文解释变量。我的猜测是,如果它是数字,Math::BigInteger
模块将重载'*'
运算符,产生准确的结果。这是Readonly
模块中的错误吗,有什么办法可以避免吗?
我使用 perl 5.10 和 Readonly 1.03 没有Readonly::XS
.
我可以用
v5.10.0
上MSWin32-x86-multi-thread
(ActivePerl)v5.10.0
在 Linux 上x86_64-linux-thread-multi
。v5.12.0
在 Windows 上 (ActivePerl)
v5.14.2
但是, (ActivePerl)不会发生这种情况。
我还用 Readonly 1.04 复制了它。我不太确定这是否相关,但Scalar::Util::looks_like_number
行为类似:
>perl -MReadonly -MScalar::Util -Mbigint -wE "say $Readonly::VERSION; Readonly my $V => 1; foreach (1..2) { say Scalar::Util::looks_like_number $V; }"
1.04
0
1