2014-02-16 99 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