Perl中的数组大小

时间:2015-08-05 09:55:37

标签: perl

我正在尝试运行此代码并输出为:

#!/usr/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";

输出:

Size: 51
Max Index: 50

对此有何解释?

2 个答案:

答案 0 :(得分:4)

在Perl中,数组是表示列表的数据结构。列表包含元素。该列表中的称为索引。第一个索引为零(0)。

您已使用这些索引和valus启动了数组:

index value
0     1
1     2
2     3

如果将第50个索引设置为某个值,则中间的所有其他索引将填充undef,即未定义的值。

您已将$#array正确识别为最大索引,或最高或最后一个索引。如果您force the array into scalar context,它会为您提供元素数量,或 size 。你也有。这将是Сухой27 said in their comment,最后一个指数减一。

如果dump out the array,您可以说明这种行为。

use strict;
use warnings;
use Data::Printer;

my @array = (1,2,3);
$array[10] = 4;

p @array;

它将输出以下内容。您再次可以看到索引从0开始,0和最高索引之间的每个数字都在那里。所以元素的数量总是比最后一个元素的索引少一个。

[
    [0]  1,
    [1]  2,
    [2]  3,
    [3]  undef,
    [4]  undef,
    [5]  undef,
    [6]  undef,
    [7]  undef,
    [8]  undef,
    [9]  undef,
    [10] 4
]

如果您来自PHP背景,这可能会令人困惑,其中数组可以包含索引或associative,但仍然可以称为 array 。在Perl中,它们被称为 hash ,它们不是有序的。

我建议您阅读Perl数据结构在perldata中的工作原理。

答案 1 :(得分:1)

您声明的实际数组是@array = (1,2,3);,这意味着此数组现在的大小为3。请注意,默认情况下,索引始终以0开头。所以这里的最大索引是2
那是$array[0] = 1, $array[1] = 2, $array[2] = 3

在下一行中,您将上述数组的索引50声明为4,这意味着现在您的数组将具有最大索引51的总50个值。
$array[50] = 4;

您已经声明了索引0,1,2&的值50.因此,剩余的值将指定为未定义的值。

$size = @array; - 这里使用标量上下文来获取数组的大小。因此,您将输出print "Size: $size\n";作为51

$max_index = $#array; - 这里它将显示最高的索引。因此,您将输出打印"Max Index: $max_index\n";设为50