2013-03-07 4 views
12

विशेष सरणी, @_, जहां एक समारोह में पारित सभी तर्क मौजूद हैं, वास्तव में पारित तर्कों के लिए एक उपनाम है। इसलिए, हम इस विशेष सरणी @_ पर सीधे किए गए किसी भी बदलाव को मुख्य रूप से भी प्रतिबिंबित करेंगे। यह स्पष्ट है।पर्ल: विशेष सरणी @_ वास्तव में उपनाम नहीं है?

#!/usr/bin/perl 

use warnings; 
use strict; 

$\="\n"; 

sub func { 
     print \@_; 
     $_++ for(@_); 
} 

my @arr=(2..4); 
print \@arr; 
func(@arr); 
print "@arr"; 

उपरोक्त कार्यक्रम के लिए, मैं @arr और @_ के संदर्भ में एक ही स्थान को इंगित करने के बाद से यह एक उपनाम है उम्मीद। लेकिन यह वैसा नहीं है।

ऊपर चल रहा है पर:

ARRAY(0x1b644d0) 
ARRAY(0x1b644e0) 
3 4 5 

वे 2 अलग-अलग स्थानों की ओर इशारा करते रहे हैं, तो कैसे परिवर्तन @_ में किया @arr में दर्शाती है?

क्या मुझे कुछ गलत दिख रहा है? कृपया सलाह दें।

+4

'@ _' कुछ भी उपनाम नहीं है। दस्तावेज कहता है कि यही नहीं है। '_ _' के व्यक्तिगत * तत्व * उपनाम हैं। –

उत्तर

17

यह आपको उत्तर मिल सकता है:

use warnings; 
use strict; 

$\="\n"; 

sub func { 
     print \@_; 
     $_++ for(@_); 
     print \$_ for @_; 
} 

my @arr=(2..4); 
print \@arr; 
func(@arr); 
print "@arr"; 
print \$_ for @arr; 

आउटपुट

ARRAY(0x17fcba0) 
ARRAY(0x1824288) 
SCALAR(0x17fcc48) 
SCALAR(0x18196f8) 
SCALAR(0x1819710) 
3 4 5 
SCALAR(0x17fcc48) 
SCALAR(0x18196f8) 
SCALAR(0x1819710) 

जैसा कि आप देख, अलग-अलग तर्क एक ही पता है लेकिन कंटेनर समान नहीं है। यदि आप किसी आइटम को @_ पर func पर @arr नहीं बदलेंगे (तो आप funct में कर सकते हैं)। इसलिए, प्रत्येक तर्क एक उपनाम है और सरणी तत्व अलग-अलग वस्तुओं के रूप में पारित होते हैं। @_ में सब कुछ subroutine में पारित किया गया है। यदि आप एक सरणी तर्क को संशोधित करना चाहते हैं तो आपको संदर्भ द्वारा इसे पास करने की आवश्यकता है।

+2

धन्यवाद बहुत अवास्तविक ... आज कुछ अच्छी चीजें हैं ... – Guru

11

@_ एलियाड नहीं है; इसके तत्व हैं।

याद रखें कि

func(@arr); 

func($arr[0], $arr[1], ...); 

रूप में ही है, क्योंकि केवल एक चीज एक उप करने के लिए पारित किया जा सकता है कि scalars की एक सूची है, और एक सरणी की एक सूची का मूल्यांकन अपने सूची संदर्भ में तत्व।

तो इसका मतलब है कि

func(@arr); 

मूल रूप से के रूप में

local @_; 
alias $_[0] = $arr[0]; 
alias $_[1] = $arr[1]; 
... 
&func; 

@_ के तत्वों को बदलने @arr के तत्वों को परिवर्तित होगा, लेकिन जोड़ने और हटाने के @_ के तत्वों @arr परिवर्तन नहीं होगा के बाद से ही है वे अलग-अलग सरणी हैं।

>perl -E"@a=(4..6); sub { $_[0] = '!';  say @_; }->(@a); say @a;" 
!56 
!56 

>perl -E"@a=(4..6); sub { splice(@_,0,1,'!'); say @_; }->(@a); say @a;" 
!56 
456 
+0

धन्यवाद ikegami .... – Guru

+0

बेहतर उदाहरण। – ikegami

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