在Perl中对稀疏数组中的元素进行计数 [英] Counting elements in a sparse array in Perl

查看:29
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆