2012-10-01 12 views
6

पर्ल शब्द मुझे भ्रमित करते हैं और यह मेरी मूल भाषा नहीं है, इसलिए मेरे साथ भालू। मैं सही शर्तों का उपयोग करने की कोशिश करूंगा, लेकिन मैं सुनिश्चित करने के लिए बस एक उदाहरण दूंगा।पर्ल मुझे एक सरणी में हैश संदर्भ के सदस्य को अस्वीकार करने की अनुमति क्यों नहीं देता है?

तो मेरे पास परिवर्तनीय $ foo में हैश संदर्भ है। आइए कहें कि $ foo -> {'bar'} -> {'baz'} एक सरणी संदर्भ है। यही है कि मैं $ foo -> {'bar'} -> {'baz'} -> [0] को स्केलर में निर्दिष्ट करके सरणी का पहला सदस्य प्राप्त कर सकता हूं।

जब मैं इस कार्य करें:

foreach (@$foo->{'bar'}->{'baz'}) 
{ 
    #some code that deals with $_ 
} 

मैं त्रुटि "script.pl लाइन पर कोई सारणी संदर्भ 41"

लेकिन जब मैं यह कर यह काम करता है:

$myarr = $foo->{'bar'}->{'baz'}; 
foreach (@$myarr) 
{ 
    #some code that deals with $_ 
} 

क्या ऐसा कुछ है जिसे मैं समझ नहीं रहा हूं? क्या कोई तरीका है कि मैं काम करने वाला पहला उदाहरण प्राप्त कर सकता हूं? मैंने अभिव्यक्ति को बाहरी पर @ के साथ कोष्ठक में लपेटने की कोशिश की, लेकिन यह काम नहीं किया। मदद के लिए समय से पहले धन्यवाद।

+0

पार्सर को समझने के लिए तुम क्या मतलब है, और वाक्य रचना आप पहली बार जाने चीजों को कोशिश आप भिन्नता @ $ foo है, जो आप कर सकते हैं नहीं आपके मामले में करना चाहते हैं। यह सब कुछ है कि विभिन्न टोकन उनके आसपास की चीजों से कैसे बंधे हैं। हमारे पास _Intermediate Perl_ में एक लंबा स्पष्टीकरण है। :) –

उत्तर

11
$myarr = $foo->{'bar'}->{'baz'}; 
foreach (@$myarr) 
{ 
    #some code that deals with $_ 
} 

आप अपने आरएचएस साथ पाश के लिए अपने $myarr में की जगह तो दिखना चाहिए, ऐसा लगता है कि: -

foreach (@{$foo->{'bar'}->{'baz'}}) 
{ 
    #some code that deals with $_ 
} 
+0

किसी और के लिए जो इस पर ठोकर खाती है, इस उत्तर की कुंजी घुंघराले ब्रेसिज़ है जो संपूर्ण अभिव्यक्ति को घेरती है। काश मैं दो उत्तरों को चिह्नित कर सकता हूं क्योंकि प्राथमिकता मुद्दे पर स्पष्टीकरण भी बहुत उपयोगी है। –

+4

@ जेसन थॉम्पसन तो आप सही के रूप में स्पष्टीकरण के साथ उत्तर क्यों नहीं चिह्नित करते? – TLP

+0

क्यों एक स्वीकृत उत्तर पर एक वोट वोट ?? क्या डाउनवॉटर यहां एक टिप्पणी छोड़ सकता है ?? –

3

यह

तरह
foreach (@{$foo->{'bar'}->{'baz'}}) 
{ 
    #some code that deals with $_ 
} 
14

यह सिर्फ एक पूर्वता मुद्दा है।

@$foo->{'bar'}->{'baz'} 

मतलब है

((@{ $foo })->{'bar'})->{'baz'} 

$foo एक सरणी संदर्भ है, इस प्रकार त्रुटि शामिल नहीं है। यदि आप संदर्भ अभिव्यक्ति के आसपास वैकल्पिक curlies को छोड़ नहीं देते हैं तो आपको प्राथमिकता समस्या नहीं मिलती है।

@{ $foo->{'bar'}->{'baz'} } 
संबंधित मुद्दे