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

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

当前回答

如果我们稍微修改一下第二个,这三个结果都是一样的:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;

其他回答

第一种和第三种方法是相同的:它们在标量上下文中计算数组。我认为这是获取数组大小的标准方法。

第二种方法实际上返回数组的最后一个索引,它(通常)与数组大小不相同。

使用第二种方法,加1:

print $#arr + 1; # Second 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的话。

如果我们稍微修改一下第二个,这三个结果都是一样的:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;

例子:

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

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