【问题标题】:Array size in PerlPerl 中的数组大小
【发布时间】:2021-02-25 05:27:59
【问题描述】:

我正在尝试运行此代码并得到以下输出:

#!/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

对此有何解释?

【问题讨论】:

  • 您的期望是什么? max_index 始终为 array_size-1。
  • @Amareesh:我在下面的答案中已经解释过了。,在哪里?
  • 我的问题是针对原始海报的。他说:“你能解释一下吗?”我在问他认为我们需要解释什么。
  • 虽然 tutorialspoint 链接确实解释了这一点,但它是以一种非常过时的方式。这是 Perl 社区试图摆脱的糟糕的旧 Perl 的来源之一。由于 OP 没有澄清,我们不要在这里制造评论战。 :)
  • @Amit:如果(似乎是这样)您正在尝试从糟糕的 TutorialsPoint 网站学习 Perl,那么请帮自己一个忙,改用 perl-tutorial.org 上推荐的东西。跨度>

标签: perl


【解决方案1】:

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

您已经使用这些索引和值开始了您的数组:

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 并且它们没有被排序。

我建议您阅读 perldata 中的 Perl 数据结构如何工作。

【讨论】:

    【解决方案2】:

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

    那是$array[0] = 1, $array[1] = 2, $array[2] = 3

    在下一行中,您将上述数组的 index 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

    【讨论】:

    • 我认为您的意思是最高索引而不是最高索引值
    猜你喜欢
    • 2016-06-16
    • 2011-11-16
    • 2016-05-03
    • 2011-08-27
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2011-05-08
    • 2017-08-07
    相关资源
    最近更新 更多