我似乎遇到了几种不同的方法来查找数组的大小。这三种方法有什么区别?
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
答案 0 :(得分:224)
第一种和第三种方式是相同的:它们在标量上下文中评估数组。我认为这是获得数组大小的标准方法。
第二种方式实际上返回数组的最后一个索引,该索引不是(通常)与数组大小相同。
答案 1 :(得分:37)
首先,第二个不等于其他两个。 $#array
返回数组的最后一个索引,该索引比数组的大小小一个。
其他两个几乎相同。您只是使用两种不同的方法来创建标量上下文。它归结为可读性问题。
我个人更喜欢以下内容:
say 0+@array; # Represent @array as a number
我发现它比
更清晰say scalar(@array); # Represent @array as a scalar
和
my $size = @array;
say $size;
后者看起来非常清楚这样,但我发现额外的线条在其他代码的一部分时不会清晰。它对于教导@array
在标量上下文中的作用很有用,也许如果你想多次使用$size
。
答案 2 :(得分:27)
通过将数组强制转换为标量上下文来获取大小,在该上下文中将其计算为大小:
print scalar @arr;
这是将数组强制转换为标量上下文的另一种方法,因为它被分配给标量变量:
my $arrSize = @arr;
这得到数组中最后一个元素的索引,所以实际上它的大小减去1(假设索引从0开始,可以在Perl中调整,尽管这样做通常是个坏主意):
print $#arr;
最后一个用于获取数组大小并不是很好。如果您只想获取数组的最后一个元素,那将非常有用:
my $lastElement = $arr[$#arr];
另外,正如您在Stack Overflow上看到的那样,大多数语法高亮显示器都无法正确处理此构造...
答案 3 :(得分:6)
要使用第二种方式,请添加1:
print $#arr + 1; # Second way to print array size
答案 4 :(得分:5)
示例:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a; # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
答案 5 :(得分:5)
如果我们稍微修改第二个结果,则所有三个都给出相同的结果:
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;
答案 6 :(得分:2)
“Perl variable types” section的perlintro documentation包含
特殊变量
$#array
告诉您数组最后一个元素的索引:print $mixed[$#mixed]; # last element, prints 1.23
您可能想要使用
$#array + 1
来告诉您阵列中有多少项。不要打扰。实际上,使用@array
Perl期望找到一个标量值(“在标量上下文中”)将给出数组中元素的数量:if (@animals < 5) { ... }
perldata documentation也涵盖“Scalar values” section。
如果在标量上下文中计算数组,则返回数组的长度。 (请注意,列表不是这样,它返回最后一个值,如C逗号运算符,也不返回内置函数,返回它们返回的任何内容。)以下内容始终为真:
scalar(@whatever) == $#whatever + 1;
有些程序员选择使用显式转换,以免产生任何疑问:
$element_count = scalar(@whatever);
同一部分的前面部分介绍了如何获取数组最后一个元素的索引。
数组的长度是标量值。您可以通过评估
@days
来查找数组$#days
的长度,如csh
中所示。但是,这不是阵列的长度;它是最后一个元素的下标,它是一个不同的值,因为通常有第0个元素。
答案 7 :(得分:2)
来自perldoc perldata,应该可以安全地引用:
以下情况始终如此:
scalar(@whatever) == $#whatever + 1;
只要你没有$#whatever ++并神秘地增加大小或你的数组。
数组索引从0开始。
和
通过为其分配空列表(),可以将数组截断为空。以下是等效的:
@whatever = (); $#whatever = -1;
这让我想到了我正在寻找的是如何检测数组是空的。我发现它是$#empty == -1;
答案 8 :(得分:2)
有多种方法可以打印数组的大小。以下是所有意义:
让我们说我们的数组是my @arr = (3,4);
这是获得数组大小的正确方法。
print scalar @arr; # prints size, here 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
我们在这里添加1,将数组视为 0-indexed 。但是,如果它不是基于零,这个逻辑将失败。
perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;' # prints 6
上面的示例打印6,因为我们已将其初始索引设置为4.现在index将分别为5和6,分别为元素3和4。
在标量上下文中使用数组时,它返回数组
的大小my $size = @arr;
print $size; # prints size, here 2
实际上方法3和方法1是相同的。
答案 9 :(得分:1)
int(@array)
如何威胁论证为标量。
答案 10 :(得分:0)
要查找数组的大小,请使用scalar
关键字:
print scalar @array;
要找出数组的最后一个索引,有$#
(Perl默认变量)。它给出了数组的最后一个索引。当数组从0开始时,我们通过向$#
添加一个来获得数组的大小:
print "$#array+1";
示例:
my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";
输出:
3
3
答案 11 :(得分:0)
正如众多答案指出的那样,第一种和第三种方法是获取数组大小的正确方法,而第二种方法不是。
在这里,我将通过一些用法示例来扩展这些答案。
@array_name
等于数组的长度=数组的大小=数组中元素的数量,在标量上下文中使用时。
下面是标量上下文的一些示例,例如@array_name
或{{1}等算术比较中的if
本身位于unless
或==
中}。
如果将!=
更改为@array_name
,则所有这些示例都将起作用。这将使代码更明确,但更长,可读性更差。因此,此处更倾向于省略scalar(@array_name)
的惯用用法。
scalar()