注意:請參閱本文末尾的最終解釋。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)有幫助。 –