2012-12-24 77 views
6

我有一個數組,@allinfogoals,我想使它成爲一個多維數組。在試圖做到這一點,我試圖把數組作爲一個項目,像這樣:將數組作爲一個項目推送到另一個數組 - 不創建多維數組

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam); 

凡在陣列括號這些項目都是單獨的字符串我有事先。不過,如果我引用$allinfogoals[0],我得到的$tempcomponents[0]的價值,如果我嘗試$allinfogoals[0][0]我得到:

Can't use string ("val of $tempcomponents[0]") as an ARRAY ref while "strict refs" in use 

我怎麼能這些陣列添加到@allinfogoals使它成爲一個多維數組?

回答

15

首先,在

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam); 

什麼也不做的括號。這只是一種奇怪的寫作方式

push(@allinfogoals, $tempcomponents[0], $tempcomponents[1], $singlehometeam); 

Parens改變優先順序;他們不創建列表或數組。


現在到你的問題。在Perl中沒有這樣的二維數組,而數組只能保持標量。解決方案是創建一個對其他數組的引用數組。這就是爲什麼

$allinfogoals[0][0] 

是短期的

$allinfogoals[0]->[0] 
    aka 
${ $allinfogoals[0] }[0] 

因此,您需要將值存儲在數組中,並把一個引用數組頂級陣列英寸

my @tmp = (@tempcomponents[0,1], $singlehometeam); 
push @allinfogoals, \@tmp; 

但是Perl提供了一個操作符,可以爲你簡化操作。

push @allinfogoals, [ @tempcomponents[0,1], $singlehometeam ]; 
3

也不清楚爲什麼這個工程,但它確實...

push (@{$allinfogoals[$i]}, ($tempcomponents[0], $tempcomponents[1], $singlehometeam)); 

需要創建一個迭代器,$i做到這一點。


根據@ikegami,接下來是原因。

這只是工作,如果$allinfogoals[$i]沒有定義,當它的寫作

@{$allinfogoals[$i]} = ($tempcomponents[0], $tempcomponents[1], $singlehometeam); 

的奇怪的是,它利用自動激活做

$allinfogoals[$i] = [ $tempcomponents[0], $tempcomponents[1], $singlehometeam ]; 

相當於可以在不$i使用來實現

push @allinfogoals, [ $tempcomponents[0], $tempcomponents[1], $singlehometeam ]; 

This last snip寵物在我的答案中詳細解釋。

+3

這可以解釋爲什麼這個工程... http://perldoc.perl。組織/ perlreftut.html – squiguy

相關問題