在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 

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

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

首先,第二个不等于另外两个。 $#array返回$#array的最后一个索引,这比数组的大小小一。

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

我个人比较喜欢以下内容:

 say 0+@array; (Represent @array as a number) 

我觉得比它清楚

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

 my $size = @array; say $size; 

后者看起来很清楚,但是我发现多余的代码在部分其他代码时会从清晰度中清除掉。 这对于教导@array在标量上下文中的作用是有用的,也许如果你想多次使用$size

这通过将数组强制为一个标量上下文来获得大小,在这个上下文中它被评估为它的大小:

 print scalar @arr; 

这是强制数组成为标量上下文的另一种方式,因为它被分配给一个标量variables:

 my $arrSize = @arr; 

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

 print $#arr; 

这最后一个是不是很好用于获取数组的大小。 如果你只是想获得数组的最后一个元素,这将是有用的:

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

另外,正如你在堆栈溢出中看到的那样,这个构造不能被大多数的语法高亮器正确地处理。

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

 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 

要使用第二种方法,请添加1:

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

perlintro文档的“Perlvariablestypes”部分包含

特殊variables$#array告诉你$#array的最后一个元素的索引:

 print $mixed[$#mixed]; # last element, prints 1.23 

你可能会试图使用$#array + 1来告诉你数组中有多less项。 不要打扰。 实际上,在Perl期望find一个标量值(“在标量上下文中”)的@array会给你数组元素的数量:

 if (@animals < 5) { ... } 

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

如果您在标量上下文中评估数组,它将返回数组的长度。 (请注意,列表不是这样的,它返回最后一个值,如C逗号运算符,也不是内置函数,它们返回他们感觉要返回的内容。)以下情况总是如此:

 scalar(@whatever) == $#whatever + 1; 

一些程序员select使用明确的转换,以免有任何疑问:

 $element_count = scalar(@whatever); 

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

数组的长度是一个标量值。 您可以通过评估$#days来查找数组@days的长度,如在csh 。 但是,这不是数组的长度; 它是最后一个元素的下标,这是一个不同的值,因为通常有第零个元素。

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

以下情况总是如此:

 scalar(@whatever) == $#whatever + 1; 

只要你不$ $任何++,神秘地增加大小或你的数组。

数组索引从0开始。

您可以通过为其分配空列表()来截断数组。 以下是等同的:

  @whatever = (); $#whatever = -1; 

这使我想到的是如何检测数组是空的。 我发现它,如果$#空== -1;

有多种方法可以打印数组的大小。 这里是所有的意思:可以说我们的数组是my @arr = (3,4);

方法1:标量

这是获得数组大小的正确方法。

 print scalar @arr; # prints size, here 2 

方法2:索引号

$#arr给出数组的最后一个索引。 所以如果数组的大小是10,那么它的最后一个索引是9。

 print $#arr; # prints 1, as last index is 1 print $#arr + 1; # Add 1 to last index to get array size 

我们在这里考虑数组0作为索引 。 但是,如果它不是基于零的话, 这个逻辑将会失败

 perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;' # prints 6 

上面的例子打印6,因为我们已经将其初始索引设置为4.现在索引将是5和6,分别是元素3和4。

方法3:

在标量上下文中使用数组时,则返回数组的大小

 my $size = @arr; print $size; # prints size, here 2 

实际上方法3和方法1是一样的。

要find数组的大小,请使用scalar关键字:

 print scalar @array; 

要找出数组的最后一个索引,有$# (Perl默认variables)。 它给出了一个数组的最后一个索引。 当数组从0开始时,我们通过给$#添加一个来获得数组的大小:

 print "$#array+1"; 

例:

 my @a = qw(1 3 5); print scalar @a, "\n"; print $#a+1, "\n"; 

输出:

 3 3