我注意到,对于使用Readonly模块声明的变量,多次计算变量会产生不同的结果.
>perl -Mbigint -MReadonly -wE "Readonly my $V => 1; foreach (1..2) { say 0 + '1000000000000001' * $V };
1000000000000000
1000000000000001
Run Code Online (Sandbox Code Playgroud)
这是为什么?这似乎是第一次在字符串中解释变量,第二次在数字上下文中.我的猜测是,如果它是数字,Math::BigInteger模块将重载'*'运算符,产生精确的结果.这是Readonly模块中的错误,有什么办法可以避免这种情况吗?
我没有使用perl 5.10和Readonly 1.03 Readonly::XS.
我可以重现那个
v5.10.0on 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
Run Code Online (Sandbox Code Playgroud) java 方法局部常量应该如何命名?
如果常量仅在方法的上下文中使用,则应在方法内部声明它(作为变量final)。但应该使用什么语法呢?对我来说,最易读的方法是使用ALL_CAPS,但 checkstyle 似乎不同意:
int compute(int n) {
final int FACTOR = 27;
return FACTOR * n;
}
Run Code Online (Sandbox Code Playgroud)
将产生 checkstyle 警告:
Name 'FACTOR' must match pattern '^[a-z][a-zA-Z0-9]*$'.
Run Code Online (Sandbox Code Playgroud)
另请参阅:您对方法作用域常量有何看法?
以下脚本在perl 5.16中崩溃.glob()在线程中使用有什么问题吗?
use strict;
use warnings;
use 5.010;
use threads;
sub f {
my $no = shift;
my @arr = glob("*");
say "thread $no: ", scalar(@arr);
}
foreach my $tno (1..5) {
my $thr = threads->create(\&f, $tno);
$thr->join();
}
Run Code Online (Sandbox Code Playgroud)
它打印
thread 1: 33
Run Code Online (Sandbox Code Playgroud)
然后崩溃与分段错误(MacOS)或访问冲突(Windows 7).用v5.16.2 on Mac OSX (darwin-thread-multi-2level)和测试ActivePerl on Windows 7 64bit (v5.16.3 built for MSWin32-x86-multi-thread).