2014-02-16 67 views
2

注意:请参阅本文末尾的最终解释。Perl:匿名多维数组

这可能是一个非常基本的问题,但我仍然试图掌握Perl中有关引用的一些基础知识,并且在perldsc页面中找到了一些我想确认的东西。以下代码是在阵列部的生成阵列:

while (<>) { 
    push @AoA, [ split ]; 
} 

显然,在while回路<>操作读取输入的一行中在一个时间。我现在假设通过[ ]括号将该行放入一个匿名数组中,我们将其称为@zero。然后,split命令将所有内容中的所有内容都放在数组内的空格中(例如,第一个字被分配给$zero[0],第二个被分配给$zero[1]等等)。 @zero的标量引用然后被推送到@AoA上。

下一行输入通过<>运算符传递并被分配到一个全新的匿名数组(例如@one),其标量引用被推送到@AoA上。

一旦@AoA被填充,我可以通过嵌套的foreach循环访问其内容;第一遍迭代通过“行”(例如for $row (@AoA))和第二内循环foreach来访问该特定行的列。

后者(访问说:“列”将通过dereferencing进行(例如,for $column (@$row))特定$row由以前的“外” foreach循环读取。
是我的理解是否正确?我假设你可以仍然可以访问@AoA的任何元素,就像它被分配与匿名一样?。每次通过Perl中的autovivication的循环部分?我想这是什么让我有点丢掉。谢谢。

编辑:基于以下评论,我对匿名数组的理解仍不清楚,所以我想多拍一张描述,看看它是否符合每个人的理解。

push @AoA, [split];声明开始,split从$ _接收行并返回列表由whitepace解析。 列表[ ]捕获,然后返回数组引用。该数组引用(由[ ]创建)然后被推送到@AoA。这是准确的吗?[ ]?下一步(解除引用/使用@AoA)通过下面的@krico进行了很好的介绍。

最终答案/解释:根据这里的所有评论/反馈,对我的部分进行进一步的研究并进行测试,似乎我的理解是正确的。我会在这里分解它,以便其他人稍后可以很容易地参考它。请参阅下面的@ krico的回应,以获得更明确的代码表示,并遵循此处概述的步骤。输入的

while (<>) { 
    push @AoA, [ split ]; 
} 
  1. 一条线在一个时间到操作者<>
  2. 传递的split函数使用线中经由$_并解析它基于空白(缺省值)。
  3. split然后返回一个LIST。
  4. [ ]是一个匿名数组,它为split传递的List提供了perl数据结构。
  5. push @AoA将对匿名数组的引用作为元素$AoA[0](第二个匿名数组引用将放入$ AoA 1,等等)。
  6. 这贯穿整个输入文件。一旦完成,@AoA是一个二维数组,为每个先前生成的匿名数组保存参考值(标量值)。
  7. 从这时起,@AoA可以被适当地取消引用,以处理从输入文件中取得的底层/引用元素。默认的解引用技术是CIRCUMFIX(请参阅下面的perlfef);但是从5.19开始,一种新的解引用方法可用,并将在5.20,POSTFIX中发布。文章链接如下。

参考Perl References Documentation,Perl References Tutorial,Perl References Question noted by @Eli Hubert,Mike Friedman's blog post about differences between arrays and lists,Upcoming Postfix dereferencing in Perl, andPostfix dereferencing Article

+1

您是否尝试了解释?如果是这样,你的产出与你期望的结果有什么不同? – fugu

+0

@FlyingFrog是的,我已经得到了我描述他们的结果。我没有预先预料过。它的工作原理,我只是想了解它为什么起作用。 – secJ

+1

'[ITEMS]'创建一个新的匿名数组并返回对该数组的引用。你可能会发现[perl参考教程](http://perldoc.perl.org/perlreftut.html#Making-References)或[this other question](http://stackoverflow.com/questions/6023821/perl-array- vs-list)有帮助。 –

回答

1

相同的代码更容易理解,你应该理解它。

my $line; 
while ($line = <STDIN>) { 
    my @parts = split $line; 
    my $partsRef = \@parts; 
    push @AoA, $partsRef; 
} 

现在,如果你想打印第五行的第二部分,你可以说。

my $ref = @AoA[4]; 
my @parts = @$ref; 
print $parts[1]; 

Get it?

+0

是的,我喜欢。感谢您打破这一部分。我在那里90%。根据其他一些评论,我真的想要捕捉使用'[]'和匿名数组,这主要是首先造成我的困惑的原因。我已经编辑了我的问题的结尾,以包括我迄今为止的理解。这看起来是否正确? – secJ

+0

根据您的输入添加了解释我的问题的结尾。谢谢。 – secJ

0

这是怎么回事:

  1. 的<>将放线进入默认变量$ _
  2. 的拆分函数将读取$ _并返回一个数组
  3. []括号将返回一个标量,它在那里将是该阵列
  4. 基准然后,该参考被推入@AoA阵列

当你$的AoA [8] [2 ]你隐式地解引用标量。它与$ AoA [8] - > [2]相同。

+0

'[]'不会返回* that *数组的引用,而是返回一个新创建的具有相同内容的数组。 – choroba

+2

Nit:'split'返回一个列表,而不是一个数组。 – Kenosis

+0

@Kenosis @choroba基于这里的一些评论,我真的想要将'[]'用作匿名数组,这主要是我首先引起混乱的原因。我已经编辑了我的原始问题的结尾,以包括我迄今为止的理解。这是否符合你驾驶的目标?谢谢 – secJ