如何获取数组中的总项目,而不是最后一个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 ...
答案 0 :(得分:39)
编辑:哈希与数组
正如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为false但已定义)。如果您设置$a[3]=undef
,则所有解决方案都不会计算它。
哈希解决方案(由yst)
正如另一个解决方案所建议的那样,您可以使用哈希并避免所有问题:
$a{0} = 1;
$a{5} = 2;
$a{23} = 3;
print scalar(keys %a), "\n"; # prints 3
此解决方案计算零和undef值。
答案 1 :(得分:16)
听起来你想要sparse array。普通数组中有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是不够的。)
答案 2 :(得分:14)
也许你想要一个哈希(或者另外)。数组是一组有序的元素;如果您创建$foo[23]
,则隐式创建$foo[0]
到$foo[22]
。
答案 3 :(得分:8)
print scalar grep {defined $ _} @a;
答案 4 :(得分:2)
@people = qw( bob john linda );
$n = @people; # the number 3
Print " le number in the list is $n \n";
Perl中的表达式总是如此 为其上下文返回适当的值。例如,怎么样的“名称”* 数组。在列表上下文中,它给出了元素列表。但是在标量上下文中,它会返回 数组中元素的数量:
答案 5 :(得分:0)
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;