2013-08-11 7 views
15

में सरणी, स्केलर और हैश को सबराउटिन पास करने के लिए एकाधिक सरणी, चर, एक सबराउटिन को हैश भेजने का सबसे अच्छा तरीका क्या है?पर्ल

सरल फॉर्म, काम करता है।

my $msg = &getMsg(1,2,3); 
print $msg; 

sub getMsg { 
    my($a, $b, $c) = @_; 
} 

मैं इस संस्करण के साथ समस्या है और एक वैश्विक का उपयोग कर जो नहीं है कि मैं क्या करना चाहते हैं के बिना सबरूटीन के लिए सुरक्षित रूप से डेटा भेजने के लिए कैसे यकीन नहीं है।

my @array = ('a','b','c'); 
my $str = "Hello"; 
my %hash = (
    'a' => ['100','nuts'], 
    'b' => ['200','bolts'], 
    'c' => ['300','screws'], 
); 

my $msg = getMsg(@array, $str, %hash); 
print $msg; 

sub getMsg { 
    my (@a, $s, %h) = @_; 
    my $MSG; 
    foreach my $x (@a) { 
     $MSG .= "\n$str, $x your hash value = $h{$x}[0] $h{$x}[1]"; 
    } 
    return $MSG 
} 

उत्तर

21

आप संदर्भ का उपयोग कर सकते हैं:

getMsg(\@array, \%hash, $scalar); 

sub getMsg { 
    my ($aref, $href, $foo) = @_; 
    for my $elem (@$aref) { 
     ... 
    } 
} 

ध्यान दें कि काम करने की कोशिश की:

my (@a, $s, %h) = @_; 

काम नहीं करता, क्योंकि @a - एक सरणी जा रहा है - ऊपर slurp होगा पूरी सूची, $s और %h छोड़कर अनियमित।

+0

ध्यान दें कि उप-$ MSG = = \ \ $ $, $ x आपके हैश मान = $ एच -> {$ x} -> [0] $ h- में उपयोग किए जाने पर पास किए गए हैशफ को संदर्भित करने की आवश्यकता है। > {$ X} -> [1] "; ' – BarneySchmale

5

मैं TLP के जवाब पसंद करते हैं, लेकिन आप यह भी एक प्रोटोटाइप का उपयोग कर सकते हैं:

getMsg(@array, %hash, $scalar); 

sub getMsg (\@\%$) { 
    my ($aref, $href, $foo) = @_; 
    for my $elem (@$aref) { 
     ... 
    } 
} 

प्रोटोटाइप (\@\%$) एक सूची संदर्भ, एक हैश संदर्भ के लिए सबरूटीन कॉल करने के लिए तर्क coerces, और से पहले एक अदिश तर्कों को चपटा और @_ में लोड किया गया है। सबराउटिन के अंदर, आपको एक सरणी और हैश के बजाय एक सूची संदर्भ और हैश संदर्भ प्राप्त होता है।

आमतौर पर, don't use prototypes