我似乎遇到了几种不同的方法来查找数组的大小。这三种方法有什么区别?

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size

当前回答

首先,第二个数组($#数组)与其他两个数组不相等。$#array返回数组的最后一个索引,它比数组的大小小1。

另外两个(标量@arr和$arrSize = @arr)实际上是相同的。您只是使用了两种不同的方法来创建标量上下文。这归结为可读性的问题。

我个人更喜欢以下几点:

say 0+@array;          # Represent @array as a number

我发现它比

say scalar(@array);    # Represent @array as a scalar

and

my $size = @array;
say $size;

后者像这样单独看起来非常清楚,但我发现当与其他代码一起使用时,额外的行会降低清晰度。它对于教授@array在标量上下文中做什么很有用,或者如果您想多次使用$size的话。

其他回答

perlintro文档的“Perl变量类型”一节包含

特殊变量$#array告诉你数组的最后一个元素的索引: 混合印刷美元($ #混合);#最后一个元素,输出1.23 您可能会想使用$#array + 1来告诉您数组中有多少项。不用麻烦了。当它发生时,使用@array, Perl期望在其中找到一个标量值(“在标量上下文中”),将为您提供数组中的元素数量: 如果(@animals < 5){…}

perldata文档在“标量值”一节中也介绍了这一点。

如果在标量上下文中计算数组,则返回数组的长度。(注意,列表不是这样的,它返回最后一个值,比如C逗号操作符;内置函数也不是这样,它返回它们想返回的任何值。)下面这句话总是正确的: 标量(@whatever) == $#whatever + 1; 一些程序员选择使用显式转换,以便不留任何疑问: $element_count =标量(@whatever);

在同一节的前面,介绍了如何获取数组的最后一个元素的索引。

数组的长度是一个标量值。你可以通过计算$#days来找到数组@days的长度,就像在csh中一样。然而,这不是数组的长度;它是最后一个元素的下标,这是一个不同的值,因为通常有第0个元素。

使用int(@array),因为它威胁参数为标量。

从perldoc perldata,引用它应该是安全的:

下面这句话总是正确的: 标量(@whatever) == $#whatever + 1;

只要你不使用$#,然后神秘地增加数组的大小。

数组下标从0开始。

and

通过给数组赋值空列表(),可以将数组截断为空。以下是等价的: @whatever = (); $#whatever = -1;

这让我想到了我一直在寻找的东西即如何检测数组是否为空。我发现如果$#empty == -1;

例子:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2

首先,第二个数组($#数组)与其他两个数组不相等。$#array返回数组的最后一个索引,它比数组的大小小1。

另外两个(标量@arr和$arrSize = @arr)实际上是相同的。您只是使用了两种不同的方法来创建标量上下文。这归结为可读性的问题。

我个人更喜欢以下几点:

say 0+@array;          # Represent @array as a number

我发现它比

say scalar(@array);    # Represent @array as a scalar

and

my $size = @array;
say $size;

后者像这样单独看起来非常清楚,但我发现当与其他代码一起使用时,额外的行会降低清晰度。它对于教授@array在标量上下文中做什么很有用,或者如果您想多次使用$size的话。