我似乎遇到了几种不同的方法来查找数组的大小.这三种方法有什么区别?
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
Chr*_*ung 228
第一种和第三种方式是相同的:它们在标量上下文中评估数组.我认为这是获得数组大小的标准方法.
第二种方式实际上返回数组的最后一个索引,它不(通常)与数组大小相同.
ike*_*ami 40
首先,第二个不等于其他两个.$#array返回数组的最后一个索引,该索引比数组的大小小一个.
其他两个实际上是相同的.您只是使用两种不同的方法来创建标量上下文.它归结为可读性问题.
我个人更喜欢以下内容:
say 0+@array;          # Represent @array as a number
我发现它比清楚的更清楚
say scalar(@array);    # Represent @array as a scalar
和
my $size = @array;
say $size;
后者看起来非常清楚这样,但我发现额外的线条在其他代码的一部分时会明显失去清晰度.它对于教授@array标量上下文中的内容很有用,也许如果你想$size多次使用它.
Nat*_*C-K 27
这通过将数组强制转换为标量上下文来获得大小,在该上下文中将其计算为其大小:
print scalar @arr;
这是将数组强制转换为标量上下文的另一种方法,因为它被分配给标量变量:
my $arrSize = @arr;
这得到了数组中最后一个元素的索引,所以实际上它的大小减去1(假设索引从0开始,可以在Perl中调整,尽管这样做通常是个坏主意):
print $#arr;
最后一个用于获取数组大小并不是很好.如果您只想获取数组的最后一个元素,那将非常有用:
my $lastElement = $arr[$#arr];
此外,正如您在Stack Overflow上看到的那样,大多数语法高亮显示器都无法正确处理此构造...
要使用第二种方式,请添加1:
print $#arr + 1; # Second way to print array size
小智 5
Example:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
如果我们稍微修改第二个,则所有三个都给出相同的结果:
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;