计算Perl中的数组元素

gri*_*lix 27 arrays perl count

如何获取数组中的总项目,而不是最后一个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
Run Code Online (Sandbox Code Playgroud)

我期待得到3 ......

Yaa*_*lch 39

编辑:哈希与数组

正如cincodenada在评论中正确指出的那样,ysth给出了一个更好的答案:我应该用另一个问题回答你的问题:"你真的想要使用Perl数组吗?哈希可能更合适."

数组为所有可能的索引分配内存,直到达到目前为止使用的最大索引.在您的示例中,您分配了24个单元格(但仅使用3个单元格).相比之下,哈希仅为实际使用的字段分配空间.

数组解决方案:标量grep

以下是两种可能的解决方案(请参阅下面的说明):

print scalar(grep {defined $_} @a), "\n";  # prints 3
print scalar(grep $_, @a), "\n";            # prints 3
Run Code Online (Sandbox Code Playgroud)

说明:添加后$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
Run Code Online (Sandbox Code Playgroud)

此解决方案计算零和undef值.


Cha*_*ens 16

听起来你想要一个稀疏数组.普通数组中有24个项目,但稀疏数组有3个.在Perl中,我们使用哈希模拟稀疏数组:

#!/usr/bin/perl

use strict;
use warnings;

my %sparse;

@sparse{0, 5, 23} = (1 .. 3);

print "there are ", scalar keys %sparse, " items in the sparse array\n",
    map { "\t$sparse{$_}\n" } sort { $a <=> $b } keys %sparse;
Run Code Online (Sandbox Code Playgroud)

keys标量上下文中的函数将返回稀疏数组中的项数.使用散列来模拟稀疏数组的唯一缺点是,如果键的顺序很重要,则必须在迭代之前对键进行排序.

您还必须记住使用该delete函数从稀疏数组中删除项目(仅将它们的值设置为undef是不够的).

  • @Spoulson没有默认排序是词法而不是数字,因此键(1,2和10)将被排序(1,10,2). (2认同)

yst*_*sth 14

也许你想要一个哈希(或者另外).数组是一组有序的元素; 如果你创建$foo[23],你隐式创建$foo[0]通过$foo[22].


kcw*_*cwu 8

print scalar grep {defined $ _} @a;

  • 说明:perl并没有真正拥有"稀疏"数组,因为grilix需要它们.如果你说"我的@a; $ a [10] = 5;" 然后perl创建一个包含11个条目的数组:前10个用'undef'填充,第11个用'5'填充.什么"标量@a"和"$#a"报告始终是总长度/最后一个索引.kcwu过滤数组以仅计算定义的条目. (5认同)