2010-05-21 14 views
5

क्या पर्ल में sub में दो सूचियों को पास करना संभव है, उदाहरण के लिए:मैं पर्ल सबराउटिन में दो सूचियों को कैसे पास कर सकता हूं?

sub Foo { 
my(@list1,@list2) = @_; 

} 

मुझे पता है कि मैं @_ दो सूचियां बना सकता हूं, प्रत्येक उपन्यास वांछित तर्क होने के साथ, मैं बस सोच रहा हूं कि कोई है या नहीं क्लीनर रास्ता

उत्तर

10

खैर अगर आप दो सरणियों आप एक प्रोटोटाइप इस्तेमाल कर सकते हैं चाहते हैं:

sub foo (\@\@) { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(@wiz, @waz); # @wiz and @waz won't be flattened. 

लेकिन वहाँ कई मायनों prot चारों ओर पाने के लिए कर रहे हैं otypes, और मैं उन्हें ज्यादातर स्थानों में से बचना पसंद करते हैं। आप बस प्रोटोटाइप को छोड़ सकते हैं और मैन्युअल रूप से संदर्भ पारित:

sub foo { 
    my $arr1 = shift; 
    my $arr2 = shift; 

    # Access arrays as references 
} 

foo(\@wiz, \@waz); # Pass in wiz/waz as refs 
foo([1,2,4],[3,5,6]); # Hard coded arrays 

आप बिल्कुल संदर्भ के साथ काम नहीं किया है, तो एक अच्छा ट्यूटोरियल के लिए perlreftut की जाँच करें।

+0

ऐसा लगता है कि प्रोटोटाइप एक बेहतर समाधान है, क्योंकि उपयोगकर्ता को सूची तर्कों को पारित करने के लिए कुछ भी करने की आवश्यकता नहीं होगी। धन्यवाद – Mike

+14

@ माइक, मैं प्रोटोटाइप के खिलाफ अनुशंसा करता हूं, क्योंकि एक अनुभवी पर्ल प्रोग्रामर संदर्भ पारित करने की आवश्यकता के मुकाबले ज्यादा आश्चर्यचकित होगा। Http://stackoverflow.com/questions/297034/why-are-perl-function-prototypes-bad देखें कि क्यों प्रोटोटाइप पर फेंक दिया जाता है। – daotoad

+0

@ माइक, मैं अक्सर प्रोटोटाइप का उपयोग करता हूं कि मैंने अपने प्रोटोटाइप विनिर्देश में एक त्रुटि की है जिसे मैंने अभी महसूस किया है। इसलिए यदि आपने पहले से ही मेरे कोड नमूने का प्रयास किया है और यह काम नहीं किया है, तो प्रोटोटाइप में परिवर्तन को नोट करें। – daotoad

5

यदि आप मूल्य से दो सूचियां पास करते हैं ... तो आपको @_ में एक बड़ी सूची मिल जाएगी।

my(@list1,@list2) = @_; किसी भी मतलब नहीं है:

1 2 3 5 6 7 
<blank line> 

दो सरणियों पास करने के लिए, आप उन्हें संदर्भ द्वारा पारित करने के लिए आवश्यकता होगी::

#!/usr/bin/perl 

sub test 
{ 
    my (@a, @b) = @_; 

    print "@a\n"; 
    print "@b\n"; 
} 

my @array1 = (1,2,3); 
my @array2 = (5,6,7); 

test(@array1, @array2); 

यह मुद्रण खत्म हो जाएगा

test(\@array1, \@array2); 

और आपके उप में आपको संदर्भ के रूप में उनका इलाज करने की आवश्यकता होगी:

sub test 
{ 
    my ($arrayRef1, $arrayRef2) = @_; 
    print "@$arrayRef1\n"; 
    print "@$arrayRef2\n"; 
} 
संबंधित मुद्दे