28

如何获取数组中的总项目,而不是最后一个 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...

4

6 回答 6

40

编辑:哈希与数组

正如 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,则没有任何解决方案会计算它。

哈希解决方案(by yst)

正如另一个解决方案所建议的那样,您可以使用哈希并避免所有问题:

$a{0}  = 1;
$a{5}  = 2;
$a{23} = 3;
print scalar(keys %a), "\n";  # prints 3

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

于 2009-05-14T14:03:05.940 回答
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;

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

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

于 2009-05-14T14:09:14.833 回答
14

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

于 2009-05-14T14:00:11.157 回答
8
print scalar grep { defined $_ } @a;
于 2009-05-14T13:53:39.020 回答
1
@people = qw( bob john linda ); 
$n = @people; # The number 3
Print " The number in the list is $n \n"; 

Perl 中的表达式总是为其上下文返回适当的值。

例如,数组的“名称” * 怎么样?在列表上下文中,它给出了元素的列表。但在标量上下文中,它返回数组中元素的数量。

于 2013-12-28T16:03:46.680 回答
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;
于 2012-03-19T10:06:23.937 回答