2014-06-07 3 views
5

में perl foreach loop मुझे संदर्भ द्वारा perl pass arg में subroutine पता है। लेकिन नीचे दिए गए कोड में, सबराउटिन में फ़ोरैच लूप @list के मान को नहीं बदलना चाहिए क्योंकि my $i को नया लेक्सिकली स्कोप var $i बनाना चाहिए। $i पर कोई भी असाइनमेंट लेक्सिक रूप से गुंजाइश होना चाहिए लेकिन @list मान को नहीं बदलना चाहिए।subloutine

कोई भी बता सकता है कि फ़ोरैच लूप के अंदर क्या हो रहा है जिससे मान @list पर बदल जाता है?

sub absList {  
    foreach my $i (@_) { 
     $i = abs($i); 
    } 
} 

@list = (-2,2,4,-4); 
absList(@list); 
print "@list"; 

आउटपुट:

2 2 4 4 

उत्तर

5

$i@_ सरणी कारण foreach सुविधा के तत्वों को एलियास किया गया है (और @_ तत्वों @list कारण @_magic के तत्वों को एलियास की गई हैं)।

से perldoc

सूची के किसी भी तत्व एक lvalue है, तो आप इसे पाश अंदर वीएआर को संशोधित करके संशोधित कर सकते हैं। इसके विपरीत, यदि LIST का कोई तत्व एक आभासी नहीं है, तो उस तत्व को संशोधित करने का कोई भी प्रयास विफल हो जाएगा। दूसरे शब्दों में, फ़ोरैच लूप इंडेक्स वैरिएबल उस सूची में प्रत्येक आइटम के लिए एक अंतर्निहित उपनाम है जिसे आप लूप कर रहे हैं।

यदि आप इस तरह के व्यवहार से बचना चाहते हैं, तो सीधे @_ सरणी पर पुन: सक्रिय न करें।

sub absList { 
    my @arr = @_; 
    foreach my $i (@arr) { 
     $i = abs($i); 
    } 
} 
+0

जानकारी के लिंक के लिए धन्यवाद। तो इसका मतलब है कि फोरैच में '$ i' हमेशा @arr के संदर्भ में/उल्लिखित किया जाएगा, भले ही मैं इसे 'my' के साथ/बिना उपयोग कर रहा हूं। और यदि '@ arr' विशेष चर '_ _' है, तो इसका अर्थ है कि' $ i'' _ _' में तत्वों का वास्तविक मान होगा। 'I i' के किसी भी मान को असाइन करने का अर्थ है' $ @ 'में तत्वों का मान बदलना। क्या मैं सही हू? – user2763829

+1

@ user2763829 हां, 'मेरा' पुनरावृत्ति चर के लिए केवल दायरे को परिभाषित करता है। –

+0

धन्यवाद। 'Fore'' में 'my' के बिना भी,' $ i' हमेशा 'foreach' लूप के भीतर scoped जाएगा क्योंकि 'i i' स्थानीय रूप से दायरा होगा। तो क्या वास्तव में 'my' से' i i '(इस परिदृश्य या किसी अन्य परिदृश्य में) घोषित करने की आवश्यकता है? – user2763829

2

$i यहाँ सूची तत्व है जो यह @_ से हो जाता है संदर्भित करता है, यही कारण है कि बदलते $i कारणों संबंधित सूची तत्व में बदल जाते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^