注意:请参阅本文末尾的最终解释。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 ];
}
- 一条线在一个时间到操作者
<>
- 传递的
split
函数使用线中经由$_
并解析它基于空白(缺省值)。 split
然后返回一个LIST。[ ]
是一个匿名数组,它为split
传递的List提供了perl数据结构。push @AoA
将对匿名数组的引用作为元素$AoA[0]
(第二个匿名数组引用将放入$ AoA 1,等等)。- 这贯穿整个输入文件。一旦完成,
@AoA
是一个二维数组,为每个先前生成的匿名数组保存参考值(标量值)。 - 从这时起,
@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
您是否尝试了解释?如果是这样,你的产出与你期望的结果有什么不同? – fugu
@FlyingFrog是的,我已经得到了我描述他们的结果。我没有预先预料过。它的工作原理,我只是想了解它为什么起作用。 – secJ
'[ITEMS]'创建一个新的匿名数组并返回对该数组的引用。你可能会发现[perl参考教程](http://perldoc.perl.org/perlreftut.html#Making-References)或[this other question](http://stackoverflow.com/questions/6023821/perl-array- vs-list)有帮助。 –