2012-05-23 26 views
22

संभव डुप्लिकेट: How do pass one array and one string as arguments to a function?पास सरणी और एक पर्ल सबरूटीन को अदिश

मैं एक समारोह, या सबरूटीन, जिसे एक श्रृंखला के रूप में और दूसरा पैरामीटर के रूप में पहले पैरामीटर में लेता है एक स्केलर उदाहरण के लिए,

sub calc { 
    my @array = $_[0]; 
    my $scalar = $_[1]; 
    print @array, $scalar; 
} 

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

my @array = ('51', 'M'); 
my $scalar = 21; 

और

calc(@array, $scalar) 

51 M प्रिंट जब मैं 51 M 21 चाहते है।

उत्तर

42

आप इसे एक संदर्भ के रूप में में पारित करने के लिए की जरूरत है:

calc(\@array, $scalar)

और फिर के रूप में इसे का उपयोग: my @array = @{$_[0]};

+3

ध्यान दें कि मेरे उत्तर का दूसरा भाग सरणी की एक प्रति बना देगा। आप इसे संदर्भ के रूप में भी छोड़ सकते हैं, और इसे अपने फ़ंक्शन – happydave

+0

पर उचित रूप से एक्सेस कर सकते हैं हालांकि यह वास्तव में काम नहीं करता है, मैंने कोशिश की। क्या आपने इसका परीक्षण किया है? –

+0

क्षमा करें, मुझे लगता है कि @ @ 0 से पहले लागू किया गया है। मैंने $ _ [0] के आसपास ब्रेसिज़ के साथ एक निश्चित संस्करण रखा है। – happydave

2

पर्ल सबराउटिन में तर्क सूची बस एक फ्लैट सरणी है। यदि आप एक अलग सरणी पास करना चाहते हैं, तो आपको इसे सरणी संदर्भ के रूप में पास करना होगा।

8

आप अपने कार्य करने के लिए सरणी के लिए एक संदर्भ पारित कर सकते हैं:

calc(\@array, $scalar); 

जब आपको अपने सबराउटिन में @array के तत्वों तक पहुंचने की आवश्यकता होती है तो आप इसे ऐसा कर सकते हैं:

my $array = $_[0]; 

# access first element of array 
print $array->[0]; 

संपादित करें: चूंकि यह मूल सरणी का संदर्भ है, इसलिए सबराउटिन में किए गए किसी भी बदलाव मूल सरणी में दिखाई देंगे।

+2

कूल, मुझे पता था कि यह कुछ वाक्यविन्यास समस्या थी, धन्यवाद! –

+0

@ डैन, यह एक वाक्यविन्यास त्रुटि नहीं थी। समस्या यह है कि आप समझ में नहीं आये कि एक उप कॉल की तर्क सूची का मूल्यांकन एक अभिव्यक्ति के रूप में किया जाता है, न कि अल्पविराम से अलग अभिव्यक्तियों की एक श्रृंखला। – ikegami

+1

वैसे मुझे बहुत कुछ पता चला, इसलिए मैं कहूंगा कि मैं असहमत हूं। मुझे बस यह नहीं पता था कि कैसे एक सरणी से गुज़र रहा है कि मैं perl को कैसे बताना है। –

9

एक सरणी रेफरी के रूप में calc सबरूटीन करने के लिए अपने सरणी दर्रा:

calc(\@array, $scalar); 
फिर अपने calc सबरूटीन में

, तो आप इस तरह अपने इनपुट पैरामीटर प्रारंभ:

sub calc { 
    my($array_ref, $scalar) = @_; 

    foreach my $item (@$array_ref) { 
    # process each item in the array ref 
    } 
} 
12

या तो के लिए एक संदर्भ का उपयोग सरणी को पहली तर्क के रूप में, या तर्कों को उलट दें ताकि स्केलर पहले हो और सरणी बाद में आती है:

sub reversed_args 
{ 
    my($scalar, @array) = @_; 
    # ... 
    print @array, $scalar, "\n"; 
} 

my @array = ('51', 'M'); 
my $scalar = 21; 

reversed_args($scalar, @array); 

Perlprototypes (दो लेख, स्टैक   ओवरफ्लो पर एक, PerlMonks पर एक कोशिश न करें)।

+0

प्रोटोटाइप का उपयोग करने का प्रयास न करने का क्या अर्थ है? –

+0

सबसे छोटा फॉर्म "पर्ल प्रोटोटाइप का उपयोग न करें"; अगला सबसे छोटा फॉर्म है "पर्ल फ़ंक्शन प्रोटोटाइप आपकी अपेक्षा के अनुसार काम नहीं करते हैं और विशेषज्ञ सलाह देते हैं कि आप उनका उपयोग करने का प्रयास न करें"। लंबे समय से चलने वाला संस्करण "पर्ल प्रोटोटाइप एक असफल प्रयोग है जो उपयोग में उपयोगी सहायता के मुकाबले अधिक दुःख और कर्कश का कारण बनता है, जिससे समस्याओं का निदान करने में कठिनाई होती है - इस मार्ग के नीचे निराशा और पागलपन है।" –