与如何在perl中返回空数组/长度为0的数组?有一点关系,但仍然不同:
在开发一些新代码时,我有一个
UNITCHECK
可以比较两个“数组”:
一个被定义为 constant
列表,而另一个是子程序调用的结果。
最初两个数组都是空的,但是 scalar
对于空列表返回 undef
,而对于子例程结果则返回 0
。
我不明白这个问题,但喜欢让
scalar
对于空列表也返回 0。
让我意识到的最初错误消息是:
不能使用未定义的值作为 ARRAY 引用...
所以我在调试器中检查了它:
NamedFlags::CODE(0xf5da48)(lib/NamedFlags.pm:95):
95: unless (scalar(@{(FLAG_NAMES)}) == scalar(_FLAGS_ENUM->names()));
DB<1> x scalar(@{(FLAG_NAMES)})
0 undef
DB<2> x FLAG_NAMES
empty array
DB<3> x @{(FLAG_NAMES)}
empty array
DB<4> x scalar @{(FLAG_NAMES)}
0 undef
DB<5> x _FLAGS_ENUM->names()
empty array
DB<7> x scalar _FLAGS_ENUM->names()
0 0
DB<8>
FLAG_NAMES
的最初定义是use constant FLAG_NAMES => ()
。
也许这个问题相当于这个。
DB<8> x scalar ()
Not enough arguments for scalar at (eval 12)[/usr/lib/perl5/5.18.2/perl5db.pl:732] line 2, near "scalar ()"
DB<9> x scalar (())
0 undef
将空列表分配给数组变量解决了问题,但如果可能的话我想避免这种情况:
DB<10> x scalar (@x = ())
0 0
我要处理语法错误。看起来你正在用
@{(FLAG_NAMES)}
两次“给我一个来自这个东西的数组”。
perl -E 'use constant FLAG_NAMES => ("a", "b"); say @{(FLAG_NAMES)}'
什么也没提供,但是
perl -E 'use constant FLAG_NAMES => ("a", "b"); say (FLAG_NAMES)'
ab
给你你所期望的。
@{...}
是您从 arrayref 中获取列表所需执行的操作,但您已经使用 (...)
创建了一个列表