在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