2012-12-24 9 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); 

लिखने का एक अजीब तरीका है माता-पिता की प्राथमिकता बदलती है; वे सूची या सरणी नहीं बनाते हैं।


अब आपके प्रश्न पर। पर्ल में 2 डी सरणी जैसी कोई चीज़ नहीं है, और सरणी केवल स्केलर रख सकती है। समाधान अन्य सरणी के संदर्भों की एक सरणी बनाना है। क्यों

$allinfogoals[0][0] 

के लिए

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

जैसे कम है कि, आप एक सरणी में अपने मान संग्रहीत और शीर्ष स्तर सरणी में कि सरणी के लिए एक संदर्भ डाल करने के लिए की जरूरत है।

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

लेकिन पर्ल एक ऑपरेटर प्रदान करता है जो आपके लिए सरल बनाता है।

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

वास्तव में सुनिश्चित नहीं हैं कि क्यों यह काम करता है, लेकिन यह करता है ...

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

पुनरावर्तक बनाने के लिए आवश्यक, $i यह करने के लिए।


@ikegami के अनुसार, क्या इस प्रकार है कारण है।

यह केवल यदि $allinfogoals[$i] काम करता है परिभाषित नहीं है, जब यह जो autovivification का इस्तेमाल करता

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

के बराबर है जो का उपयोग कर $i बिना प्राप्त किया जा सकता करने के लिए लेखन

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

का एक अजीब तरीका है

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

यह अंतिम स्निप पालतू जानवर को मेरे जवाब में विस्तार से समझाया गया है।

+3

यह समझा सकता है कि यह क्यों काम करता है ... http: //perldoc.perl।org/perlreftut.html – squiguy