【发布时间】:2014-01-22 20:15:44
【问题描述】:
我注意到使用Readonly 模块声明的变量,多次评估一个变量会产生不同的结果。
>perl -Mbigint -MReadonly -wE "Readonly my $V => 1; foreach (1..2) { say 0 + '1000000000000001' * $V };
1000000000000000
1000000000000001
这是为什么呢?
似乎第一次在字符串中解释变量,第二次在数字上下文中解释。我的猜测是,如果它是数字的,Math::BigInteger 模块将重载'*' 运算符,从而产生准确的结果。这是Readonly 模块中的错误吗,有什么办法可以避免吗?
我使用不带Readonly::XS 的 perl 5.10 和 Readonly 1.03。
我可以用
重现它-
v5.10.0onMSWin32-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
【问题讨论】:
-
不适用于
v5.16.3草莓(1000000000000001 x2) -
不在
v5.14.4linux 64 位,只读 1.04。 -
无法在 Linux 上使用带有 bigint v0.23 的 perl v5.10.1、带有 bigint v0.34 的 perl v5.18.1 或带有 bigint v0.36 的 perl v5.19.8 的 Readonly v1.04 进行复制。
-
也可以用 ActivePerl
v5.12.0复现。
标签: perl operator-overloading readonly biginteger tie