2011-06-29 46 views
5

我正在使用地圖來提取二維數組的第一個元素。這是小代碼片段。瞭解此地圖行爲

my $array = [ [1,11,111], [2,22], undef, [4] ]; 

my @firstList = map { (defined $_) && $_->[0] } @$array; 

所以在這裏,我期待地圖返回一個數組,其值爲undef或$ array的第一個元素。

但輸出與我所期望的不一樣。 對於undef,我得到'scalar'類型的元素。

如果我用下面的塊更改映射語句,那麼我會得到預期的結果。

my @firstList = map { $_->[0] } @$array; 

請幫我理解這兩個map語句。

回答

4

它們都返回上次執行操作的結果。

首先,當它評估(defined $_) && $_->[0]undef時,它看到defined $_爲假,並停止處理布爾表達式。在這種情況下,$_->[0]根本不被評估。 defined $_是評估的最後一項操作,其結果爲false,我猜測該值爲0

對於第二個,它是@$array的孩子的實際值,它是獲取undef值的位置。

+0

一個小的更正:'定義undef'返回'''''。 – Dallaylaen

+2

我想知道爲什麼undef - > [0]可以工作(甚至在'strict'下)。發現它是[autovivified](http://en.wikipedia.org/wiki/Autovivification),即隱式設置爲原始數組**中的[] **。 – Dallaylaen

+1

@Dallaylaen:這讓足夠多的人知道CPAN在http://search.cpan.org/perldoc?autovivification上有一個「autovivification」模塊,它允許你使用「no autovivification」命令禁用它; –

0
map { (defined $_) && $_->[0] } 

實際上遍歷數組中的每個元素,並應用某個函數或表達式。如果你的單元格是undef,你的數組中的第三個單元格的計算結果爲defined(undef) && $->[0](相當於'',你可以試試..),而另一個計算爲1 && $->[0],等於$ - > [0 ]。

順便說一句,這也是你的第二條陳述的原因,對於你的數組的每個單元格,你選擇第一個內部單元格。