如何获取数组中的总项目,而不是最后一个ID?
没有两种方式我发现做这个工作:
my @a; # Add some elements (no consecutive ids) $a[0]= '1'; $a[5]= '2'; $a[23]= '3'; print $#a,"\n"; # Prints 23 print scalar(@a),"\n"; # Prints 24
我希望得到3 …
解决方法
编辑:哈希与阵列
正如cincodenada在注释中正确指出的,ysth给了一个更好的答案:我应该用另一个问题回答你的问题:“你真的想使用Perl数组吗?哈希可能更合适。
数组为所有可能的索引分配内存,直到到目前为止使用的最大。在您的示例中,您分配24个单元格(但只使用3)。相比之下,散列仅为实际使用的那些字段分配空间。
数组解:标量grep
这里有两个可能的解决方案(见下面的解释):
print scalar(grep {defined $_} @a),"\n"; # prints 3 print scalar(grep $_,@a),"\n"; # prints 3
说明:在添加$ a [23]之后,你的数组真的包含24个元素,但是大多数是未定义的(它也计算为false)。您可以计算定义元素的数量(如第一个解决方案中所做的)或真实元素的数量(第二个解决方案)。
有什么不同?如果你设置$ a [10] = 0,那么第一个解决方案会计数,但第二个解决方案不会(因为0是假的,但是定义)。如果你设置$ a [3] = undef,解决方案都不会计算。
哈希解(由yst)
正如另一个解决方案所建议的,你可以使用哈希并避免所有的问题:
$a{0} = 1; $a{5} = 2; $a{23} = 3; print scalar(keys %a),"\n"; # prints 3
此解决方案计算零值和undef值。