【问题标题】:perl - trouble understanding array of arraysperl - 难以理解数组数组
【发布时间】:2011-06-24 14:36:57
【问题描述】:

我正在尝试创建一个数组数组,然后引用它们。

我做了类似的事情:

sub foobar
{
 my @array;
 my $i;
 for ($i = 0; $i < 1000; $i=$i+1)
 {
  my @row;
  $row[0] = $i;
  $row[1] = foo($bar);
  push @array , [@row];
 }
 return \@array;
}

我可以通过以下方式获取值:

$array->[x]->[y];

但是我不明白为什么需要第二个 -> 。 $array->[x] 我理解,因为 $array 是一个参考。但是 $array->[x] 不是一个数组吗?为什么这不起作用:

my @notarray = $array->[x];

现在数组中到底有什么没有填充?因为它看起来肯定不是包含 $i 、 foo($bar)

的数组

$array->[x]->[y] 对于对数组引用的数组的引用有何不同?

【问题讨论】:

    标签: arrays perl multidimensional-array


    【解决方案1】:

    实际上不需要第二个-&gt;

    这里是交易:所有 Perl 数组值和散列值都必须是标量。这意味着字符串、数字或数组/哈希引用(而不是普通的旧数组或哈希)。

    所以第一个 -&gt; 运算符取消引用数组并获得第 x 行。那里——不是一个数组,而是一个数组引用。因此,为了获取其中的数据,理论上您需要另一个 -&gt; 运算符。

    但是得到这个。 Perl 很聪明:它知道在一个数组或哈希访问之后,如果发生另一个访问,唯一可能的方法是通过数组/哈希引用(因为您的第一个数组/哈希访问必须返回一个标量)!所以你根本不需要第二个箭头。

    更多详情请见perldata

    【讨论】:

    • 谢谢,出于某种原因,我开始相信可以有数组数组,但它们实际上是引用数组。
    【解决方案2】:

    当你

    push @array, [@row];
    

    您正在将 reference 推送到数组。这是必要的,因为 Perl 的规则是将数组展平。所以 $array->[x] 是对行数组的引用,而不是行数组本身。但是,在下标之间,箭头是可选的。所以$array-&gt;[x]-&gt;[y]$array-&gt;[x][y]完全一样(和${$array}[x][y]等完全一样)

    这在Perl reference tutorial中都有解释

    【讨论】:

    • 如果我推送一个引用,那么为什么每一行仍然不同?他们不应该指的是同一件事吗?
    • @kiasectomondo:你每次都在创建一个新的匿名参考。如果您只是每次都推送\@array(对于相同的@array),那将指的是同一件事。
    • @kiasectormondo => 如果您在循环之外声明了@row 数组,并且通过\@row 引用了它,那么这些行只会引用相同的内容。 [@row] 语法创建数组的浅拷贝,并返回新的引用。在您的情况下,由于您在循环内声明 my @row,因此您可以使用 \@row,它会正常工作。
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多