我似乎遇到了几种不同的方法来查找数组的大小。这三种方法有什么区别?
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);
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
当前回答
perlintro文档的“Perl变量类型”一节包含
特殊变量$#array告诉你数组的最后一个元素的索引: 混合印刷美元($ #混合);#最后一个元素,输出1.23 您可能会想使用$#array + 1来告诉您数组中有多少项。不用麻烦了。当它发生时,使用@array, Perl期望在其中找到一个标量值(“在标量上下文中”),将为您提供数组中的元素数量: 如果(@animals < 5){…}
perldata文档在“标量值”一节中也介绍了这一点。
如果在标量上下文中计算数组,则返回数组的长度。(注意,列表不是这样的,它返回最后一个值,比如C逗号操作符;内置函数也不是这样,它返回它们想返回的任何值。)下面这句话总是正确的: 标量(@whatever) == $#whatever + 1; 一些程序员选择使用显式转换,以便不留任何疑问: $element_count =标量(@whatever);
在同一节的前面,介绍了如何获取数组的最后一个元素的索引。
数组的长度是一个标量值。你可以通过计算$#days来找到数组@days的长度,就像在csh中一样。然而,这不是数组的长度;它是最后一个元素的下标,这是一个不同的值,因为通常有第0个元素。
其他回答
使用scalar关键字查找数组的大小:
print scalar @array;
要找出数组的最后一个索引,可以使用$# (Perl默认变量)。它给出了数组的最后一个索引。当数组从0开始时,我们通过给$#加1来获取数组的大小:
print "$#array+1";
例子:
my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";
输出:
3
3
使用第二种方法,加1:
print $#arr + 1; # Second way to print array size
正如许多答案所指出的那样,第一种和第三种方法是获取数组大小的正确方法,而第二种方法则不是。
在这里,我将用一些用法示例来扩展这些答案。
@array_name在标量上下文中使用时,计算结果为数组的长度=数组的大小=数组中的元素数量。
下面是标量上下文的一些示例,例如在if或unless中单独使用@array_name,用于==或!=这样的算术比较。
如果将@array_name更改为标量(@array_name),所有这些示例都将正常工作。这将使代码更显式,但也更长,可读性稍差。因此,这里更倾向于使用省略scalar()的习惯用法。
my @a = (undef, q{}, 0, 1);
# All of these test whether 'array' has four elements:
print q{array has four elements} if @a == 4;
print q{array has four elements} unless @a != 4;
@a == 4 and print q{array has four elements};
!(@a != 4) and print q{array has four elements};
# All of the above print:
# array has four elements
# All of these test whether array is not empty:
print q{array is not empty} if @a;
print q{array is not empty} unless !@a;
@a and print q{array is not empty};
!(!@a) and print q{array is not empty};
# All of the above print:
# array is not empty
第一种和第三种方法是相同的:它们在标量上下文中计算数组。我认为这是获取数组大小的标准方法。
第二种方法实际上返回数组的最后一个索引,它(通常)与数组大小不相同。
如果我们稍微修改一下第二个,这三个结果都是一样的:
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;