【问题标题】:How does negative array index in perl works?perl 中的负数组索引如何工作?
【发布时间】:2014-01-26 03:49:56
【问题描述】:

最近我在perl 作品中遇到了负面索引。基本上,当我们在 perl 中给数组一个负索引时,它会从后面开始遍历。
例如:

@numbers = (1,2,3,4,5,6);
print "$numbers[-1]\n";

它将输出打印为 6。如果我将索引指定为 -2,那么它会打印 5 等等。
据我了解数组内存如下:

我想知道,索引 -1 如何在 perl 中变为 n。谁能解释一下这是如何工作的?

P.S:如果我在 java 中使用负索引,那么它会抛出 java.lang.ArrayIndexOutOfBoundsException

【问题讨论】:

  • 你可以把$numbers[-1]想成$numbers[ @numbers-1 ] 也可以看看stackoverflow.com/q/15911115/223226
  • @mpapec,perl 解释器是否会负责将-1 转换为@numbers-1
  • 你可以这么说,但减号只是指示 perl 从数组末尾获取元素。
  • @reinierpost:你为什么要分享一个来自五年前的 Perl 版本的文档链接? perldoc.perl.org/perldata.html#Subscripts 肯定会更好?
  • @Dave Cross:因为我见过的关于 Perl 的大多数问题,至少在这个级别上,都源于使用 10 甚至 15 年的 Perl 版本的人.

标签: arrays perl


【解决方案1】:

谁能解释一下这是如何工作的?

用于获取数组元素的 Perl API 调用 av_fetch 与 C 语言等效

my $real_index = $index < 0 ? @array+$index : $index;

more precicely

$index += $#array+1 if $index < 0;

【讨论】:

    【解决方案2】:

    More About Indices

    我们之前说过数组索引是非负整数。虽然这在某种程度上是严格正确的,但 perl 方便地让您使用负索引从数组末尾索引元素。 -1 指最后一个元素,-2 指倒数第二个元素,依此类推。为了简化一点,-1 就像 $#array... 的别名...但仅在索引 @array 的上下文中!

    所以以下是等价的:

    $array[ -1 ]
    $array[ $#array ]
    

    但要小心:

    @array[ 0 .. $#array ]
    

    不能写成:

    @array[ 0 .. -1 ]
    

    因为在这种情况下 -1 是 .. 范围运算符的参数,它不知道实际需要什么“最高索引号”。


    之所以有效,是因为在数组索引的上下文中使用它时,它实际上只是一个别名。

    【讨论】:

      【解决方案3】:

      Perl 数组不是 C 数组。它们更像 Java 的javal.util.ArrayList。这个数据结构包括一些元数据,比如数组的长度,而不仅仅是起始指针。

      现在在 Perl 中,当访问数组的代码看到负索引时,它会添加数组的长度:给定一个长度为 n+1 的数组,那么 -1 + (n+1) 是索引 n。这是一个方便的语言特性,但有些语言(尤其是“系统编程语言”,如 C)希望避免隐含的开销。

      【讨论】:

        【解决方案4】:

        虽然这在某种程度上是严格正确的,但 perl 可以方便地让您使用负索引从数组末尾开始索引元素。 -1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。为了简化一点,-1 充当 $#array... 的别名,但仅在索引 @array 的上下文中!

        【讨论】:

          【解决方案5】:

          这是一个记录在案的功能。 (参见perldoc perldata下标部分。)

          【讨论】:

            猜你喜欢
            • 2013-04-01
            • 2014-01-21
            • 1970-01-01
            • 1970-01-01
            • 2015-07-19
            • 1970-01-01
            • 1970-01-01
            • 2020-02-03
            • 1970-01-01
            相关资源
            最近更新 更多