如何避免空数组的`scalar`返回`undef`?

问题描述 投票:0回答:1

如何在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
arrays perl constants
1个回答
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 中获取列表所需执行的操作,但您已经使用
(...)

创建了一个列表
© www.soinside.com 2019 - 2024. All rights reserved.