如何获取数组中的所有项数量,而不是最后一个 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个结果,但实际上只有2个。 我该如何解决这个问题?
编辑:哈希表与数组
正如cincodenada在评论中正确指出的,ysth给出了更好的答案:我应该用另一个问题回答你的问题:“你真的想使用Perl数组吗?哈希表可能更合适。”
数组会为迄今使用的最大索引分配所有可能的内存。在您的示例中,您分配了24个单元格(但仅使用了3个)。相比之下,哈希表仅为实际使用的字段分配空间。
数组解决方案:标量grep
以下是两种可能的解决方案(请参见下文解释):
print scalar(grep {defined $_} @a), "\n"; # prints 3
print scalar(grep $_, @a), "\n"; # prints 3
解释:在添加了 $a[23]
后,你的数组实际上包含了 24 个元素——但大多数未定义(也可以理解为假)。你可以计算已定义元素的数量(第一种解决方案所做的),也可以计算真实元素的数量(第二种解决方案)。$a[10]=0
,则第一种解决方案将计数,但第二种解决方案将不计数(因为 0 是假但已定义)。如果你设置 $a[3]=undef
,则两种解决方案都不会计数。$a{0} = 1;
$a{5} = 2;
$a{23} = 3;
print scalar(keys %a), "\n"; # prints 3
这个解决方案计算零和未定义的值。
看起来你需要一个稀疏数组。正常的数组中有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;
keys
函数在标量上下文中返回稀疏数组中项目的数量。使用哈希模拟稀疏数组的唯一缺点是,如果它们的顺序很重要,则必须在迭代之前对键进行排序。
您还必须记住使用delete
函数从稀疏数组中删除项目(仅将其值设置为undef不足够)。
也许你想要一个哈希(Hash)代替数组,或者同时使用。数组是一组有序的元素;如果你创建 $foo[23]
,那么你就隐式地创建了 $foo[0]
到 $foo[22]
。
print scalar grep { defined $_ } @a;
@people = qw( bob john linda );
$n = @people; # The number 3
Print " The number in the list is $n \n";
sub uniq {
return keys %{{ map { $_ => 1 } @_ }};
}
my @my_array = ("a","a","b","b","c");
#print join(" ", @my_array), "\n";
my $a = join(" ", uniq(@my_array));
my @b = split(/ /,$a);
my $count = $#b;
print scalar(grep { $_ } @a), "\n";
- arikinkeys
调用:简单的scalar %a
就足够了。 - cl0ne