/ / उपयोग के साथ कार्यों या छोरों में प्रयोग करने योग्य चर बनाने के लिए कैसे: सख्त पर - पर्ल, छोरों, चर, गुंजाइश, वैश्विक

फ़ंक्शंस या उपयोग के साथ लूप में उपयोग करने योग्य चर बनाने के लिए: सख्त ऑन - पर्ल, लूप, वेरिएबल्स, स्कोप, ग्लोबल

मेरे पास एक लूप है जो कुछ XML को पार्स करता है। उस लूप में, कई और लूप हैं जो यदि कुछ मान मौजूद हैं, तो मैं एक सरणी बनाता हूं और उसमें इस तरह से मान डालता हूं:

for (@{ $product->{$basename} }) {

# there are two values for PACKAGE. create a unique list for each value
$package = $_->{PACKAGE};

if ($package eq "RETAIL") {
...values read from xml...
push (@myListRetail, [$one, $two, $three];
}

if ($package eq "ADVISOR") {
...values read from xml...
push (@myListAdvisor, [$one, $two, $three];
}

मुख्य XML पार्स लूप बंद होने के बाद, मैं फिर उन सरणियों के अस्तित्व के लिए परीक्षण करता हूं, और उन्हें एक नए सरणी में डालता हूं:

# add this array to the package name array
if (@myListRetail) {
push @packageNames, @myListRetail;
}

# add this array to the package name array
if (@myListAdvisor) {
push @packageNames, @myListAdvisor;
}

यह सब अच्छा, सरल और काम करता है।

लेकिन, मुझे "टी का उपयोग नहीं है: सख्त पर। जब मैं इसे चालू करता हूं, तो मुझे" स्पष्ट पैकेज "चेतावनी मिलती है क्योंकि मैं" मेरे "के बिना सरणियों का निर्माण कर रहा हूं।

मैं उन्हें "मेरे" के रूप में पूर्व घोषित नहीं करता@myListRetail "आदि, लूप के बाहर, क्योंकि मुझे उनके अस्तित्व के लिए परीक्षण करने की आवश्यकता है। यदि मैं उन्हें लूप के अंदर" मेरे "के साथ घोषित करता हूं, तो वे स्कोप किए जाते हैं और मैं उन्हें प्राप्त नहीं कर सकता।

मुझे पता है कि मुझे सख्त होना चाहिए, लेकिन जब मैं करता हूं, तो स्क्रिप्ट "मेरे" त्रुटि के कारण टूट जाती है।

मैं एक लूप में एक चर को कैसे परिभाषित कर सकता हूं और बना सकता हूं जिसे मैं लूप (या फ़ंक्शन या किसी अन्य दायरे) के बाहर उपयोग कर सकता हूं और अभी भी एक स्क्रिप्ट में कहीं और उपयोग कर सकता हूं?

उत्तर:

जवाब के लिए 3 № 1

मुख्य XML पार्स लूप बंद होने के बाद, मैं तब अस्तित्व के लिए परीक्षण करता हूं उन सरणियों में, और उन्हें एक नए सरणी में डाल दिया:

# add this array to the package name array
if (@myListRetail) {
push @packageNames, @myListRetail;
}

जाँच if (@myListRetail) @myListRetail की मौजूदगी के लिए doesn "t" टेस्टजैसा आप सोचते हैं। यह @myListRetail में तत्वों की संख्या की जाँच करता है। और अगर सरणी में कोई तत्व नहीं है तो यह शून्य देता है - जो पर्ल गलत के रूप में मूल्यांकन करता है।

तो यह मुझे लगता है कि यह पहले से ही वही कर रहा है जो आप चाहते हैं। बस आपको अपने मुख्य लूप और सभी के बाहर इन सरणियों को घोषित करना है strict) खुश हो जाएगा।


उत्तर के लिए -3 № 2

कम से कम एक तत्व होने पर परीक्षण करें:

 if ($myListRetail[0]) {
push @packageNames, @myListRetail;
}