在Perl中对稀疏数组中的元素进行计数 [英] Counting elements in a sparse array in Perl
本文介绍了在Perl中对稀疏数组中的元素进行计数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何获取数组中的项目总数,而不是最后一个ID?
我找到的两种方法都不管用:
my @a;
# Add some elements (no consecutive ids)
$a[0]= '1';
$a[5]= '2';
$a[23]= '3';
print $#a, "
"; # Prints 23
print scalar(@a), "
"; # Prints 24
我预计会得到3.
推荐答案
编辑:哈希与数组
正如cincodenada在评论中正确指出的那样,ysth给出了更好的答案:我应该用另一个问题回答您的问题:"您真的想使用Perl数组吗?散列可能更合适。"
数组为所有可能的索引分配内存,最大可达迄今使用的最大值。在您的示例中,您分配了24个单元(但只使用了3个)。相比之下,哈希仅为实际使用的字段分配空间。阵列解决方案:标量grep
这里有两种可能的解决方案(参见下面的说明):
print scalar(grep {defined $_} @a), "
"; # prints 3
print scalar(grep $_, @a), "
"; # prints 3
说明:在添加$a[23]
之后,您的数组实际上包含24个元素-但是大多数元素都是未定义的(这也会计算为false)。您可以计算已定义元素的数量(如在第一个解决方案中所做的那样)或计算真实元素的数量(第二个解决方案)。
有什么不同?如果设置$a[10]=0
,则第一个解决方案将对其进行计数,但第二个解决方案不会(因为0为false,但已定义)。如果设置$a[3]=undef
,则所有解决方案都不会计算在内。
哈希解决方案(按yst)
按照另一个解决方案的建议,您可以使用散列并避免所有问题:
$a{0} = 1;
$a{5} = 2;
$a{23} = 3;
print scalar(keys %a), "
"; # prints 3
此解决方案计算零和undef值。
这篇关于在Perl中对稀疏数组中的元素进行计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文