在Perl中查找数组的大小

时间:2011-09-13 18:40:47

标签: 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

12 个答案:

答案 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” sectionperlintro 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);

方法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

我们在这里添加1,将数组视为 0-indexed 。但是,如果它不是基于零,这个逻辑将失败

perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

上面的示例打印6,因为我们已将其初始索引设置为4.现在index将分别为5和6,分别为元素3和4。

方法3:

在标量上下文中使用数组时,它返回数组

的大小
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()