在Perl中查找数组的大小

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

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
解决办法

第一种和第三种方法是一样的:它们在标量上下文中评估一个数组。我认为这是获得数组大小的标准方法。

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

评论(8)

首先,第二个不等同于其他两个。$#array返回数组的最后一个索引,它比数组的大小少一个。

其他两个实际上是一样的。你只是用两种不同的方法来创建标量上下文。这归结为一个可读性问题。

我个人更喜欢下面的方式。

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

我觉得它比

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

my $size = @array;
say $size;

后者像这样单独看起来很清楚,但我发现,当作为其他代码的一部分时,多出来的一行就不清楚了。这对于教授@array在标量上下文中的作用很有用,如果你想多次使用$size的话。

评论(13)

这通过强制数组进入标量上下文来获得大小,在标量上下文中,它被评估为其大小。

print scalar @arr;

这是强迫数组进入标量上下文的另一种方式,因为它被分配给一个标量变量。

my $arrSize = @arr;

这就得到了数组中最后一个元素的索引,所以它实际上是大小减去1(假设索引从0开始,这在Perl中是可以调整的,尽管这样做通常是个坏主意)。

print $#arr;

最后一个例子并不适合用于获取数组的大小。如果你只想获得数组的最后一个元素,那么它就很有用。

my $lastElement = $arr[$#arr];

另外,正如你在Stack Overflow上看到的,大多数语法高亮器都不能正确处理这种结构......

评论(2)