Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays perl-难以理解数组的数组_Arrays_Perl_Multidimensional Array - Fatal编程技术网

Arrays perl-难以理解数组的数组

Arrays perl-难以理解数组的数组,arrays,perl,multidimensional-array,Arrays,Perl,Multidimensional Array,我试图创建一个数组,然后引用它们 我做了一些事情,比如: 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]我理解,因为$array是一个引用。但是$a

我试图创建一个数组,然后引用它们

我做了一些事情,比如:

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]我理解,因为$array是一个引用。但是$array->[x]不就是一个数组吗?为什么这不起作用:

my @notarray = $array->[x];
现在数组中到底没有填充什么?因为它显然不是一个包含$i,foo$bar的数组

对于数组的引用数组,$array->[x]->[y]会有什么不同

push @array, [@row];
您正在将引用推送到数组。这是必要的,因为Perl的规则是将数组展平。因此,$array->[x]是对行数组的引用,而不是对行数组本身的引用。但是,在下标之间,箭头是可选的。所以$array->[x]->[y]与$array->[x][y]完全相同,后者与${$array}[x][y]完全相同,等等

当您

push @array, [@row];
您正在将引用推送到数组。这是必要的,因为Perl的规则是将数组展平。因此,$array->[x]是对行数组的引用,而不是对行数组本身的引用。但是,在下标之间,箭头是可选的。所以$array->[x]->[y]与$array->[x][y]完全相同,后者与${$array}[x][y]完全相同,等等

这些都在

中解释过,实际上第二个->是不需要的

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

因此,第一个->操作符取消对数组的引用并到达第x行。在中-不是数组,而是数组引用。因此,为了获取其中的数据,理论上需要另一个->操作符

但你要明白这一点。Perl很聪明:它知道在一次数组或散列访问之后,如果发生另一次访问,唯一可能的方法是通过数组/散列引用,因为第一次数组/散列访问必须返回标量!所以你根本不需要第二支箭

有关更多详细信息,请参阅。

第二个->实际上不需要

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

因此,第一个->操作符取消对数组的引用并到达第x行。在中-不是数组,而是数组引用。因此,为了获取其中的数据,理论上需要另一个->操作符

但你要明白这一点。Perl很聪明:它知道在一次数组或散列访问之后,如果发生另一次访问,唯一可能的方法是通过数组/散列引用,因为第一次数组/散列访问必须返回标量!所以你根本不需要第二支箭


有关更多详细信息,请参阅。

如果我正在推送引用,那么为什么每行仍然不同?他们不应该引用相同的东西吗?@kiasectomondo:你每次都在创建一个新的匿名引用。如果您每次只为引用同一事物的同一@array按\@array。@kiasectormondo=>如果您在循环外部声明了@row数组,并通过\@row引用了它,那么这些行只会引用同一事物。[@row]语法创建数组的浅层副本,并返回新引用。在你的例子中,既然你在循环中声明了我的@row,你可以使用\@row,它会很好地工作。如果我推一个引用,那么为什么每一行仍然不同?他们不应该引用相同的东西吗?@kiasectomondo:你每次都在创建一个新的匿名引用。如果您每次只为引用同一事物的同一@array按\@array。@kiasectormondo=>如果您在循环外部声明了@row数组,并通过\@row引用了它,那么这些行只会引用同一事物。[@row]语法创建数组的浅层副本,并返回新引用。在您的情况下,由于您在循环中声明了我的@row,您可以使用\@row,它会很好地工作。谢谢,出于某种原因,我开始相信可以使用数组数组,但它们实际上是引用数组。谢谢,出于某种原因,我开始相信可以使用数组数组,但它们实际上是引用数组。