我似乎遇到了几种不同的方法来查找数组的大小。这三种方法有什么区别?
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
当前回答
这个函数通过强制数组进入一个标量上下文来获取数组的大小,在这个上下文中数组的值是数组的大小:
print scalar @arr;
这是另一种强制数组进入标量上下文的方式,因为它被赋值给一个标量变量:
my $arrSize = @arr;
这将获得数组中最后一个元素的索引,因此它实际上是大小减1(假设索引从0开始,这在Perl中是可调整的,尽管这样做通常是一个坏主意):
print $#arr;
最后一个不太适合用于获取数组大小。如果你只想获取数组的最后一个元素,它会很有用:
my $lastElement = $arr[$#arr];
此外,正如你在Stack Overflow上看到的,大多数语法高亮显示器都不能正确处理这个构造……
其他回答
例子:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a; # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
首先,第二个数组($#数组)与其他两个数组不相等。$#array返回数组的最后一个索引,它比数组的大小小1。
另外两个(标量@arr和$arrSize = @arr)实际上是相同的。您只是使用了两种不同的方法来创建标量上下文。这归结为可读性的问题。
我个人更喜欢以下几点:
say 0+@array; # Represent @array as a number
我发现它比
say scalar(@array); # Represent @array as a scalar
and
my $size = @array;
say $size;
后者像这样单独看起来非常清楚,但我发现当与其他代码一起使用时,额外的行会降低清晰度。它对于教授@array在标量上下文中做什么很有用,或者如果您想多次使用$size的话。
如果我们稍微修改一下第二个,这三个结果都是一样的:
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;
使用int(@array),因为它威胁参数为标量。
打印数组大小的方法有很多种。以下是所有单词的含义:
假设数组是@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; # Adds 1 to the last index to get the array size
我们在这里加1,将数组视为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
实际上,方法三和方法一是一样的。