2017-01-05 14 views
5

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

foreach $sub (@arr){ 
     print "Calling $sub\n"; 
     #---How to call $sub?---- 
     &$sub; ## will not work 
} 
+0

'(\ & $ नाम) -> (@ args)' – ikegami

उत्तर

10

आपका कोड सामान्य रूप में सही है, लेकिन आप पर्ल आप कोड refs के रूप में चर सामग्री का उपयोग करने की अनुमति बनाने के लिए strict 'refs' बंद करने के लिए की जरूरत है।

use strict; 
use warnings; 

sub foo { print "foo" } 
sub bar { print "bar" } 

my @arr = qw/foo bar/; 
foreach my $sub (@arr) { 
    no strict 'refs'; 
    print "Calling $sub\n"; 

    &$sub(); 
} 

उत्पादन यहाँ है:

Calling foo 
fooCalling bar 
bar 

मैं भी कॉल के बाद कोष्टक () जोड़ दिया है। इस तरह हम %$sub पर कोई तर्क नहीं देते हैं। यदि हम उन नहीं हैं, तो वर्तमान सबराउटिन की @_ तर्क सूची का उपयोग किया जाएगा।


हालांकि, आपको शायद ऐसा नहीं करना चाहिए। विशेष रूप से यदि @arr में उपयोगकर्ता इनपुट है, तो यह एक बड़ी समस्या है। आपका उपयोगकर्ता कोड इंजेक्ट कर सकता है। इस पर विचार करें:

my @arr = qw/CORE::die/; 

अब हम निम्नलिखित आउटपुट प्राप्त:

Calling CORE::die 
Died at /home/code/scratch.pl line 1492. 

उफ़। आप यह नहीं करना चाहते हैं। die उदाहरण बहुत बुरा नहीं है, लेकिन इस तरह आप आसानी से कुछ अलग पैकेज में कोड कॉल कर सकते हैं जिसका इरादा नहीं था।

dispatch table बनाने के लिए शायद बेहतर है। मार्क जेसन डोमिनस द्वारा उच्च ऑर्डर पर्ल में उन लोगों के बारे में एक संपूर्ण अध्याय है, जिन्हें आप download for free on his website कर सकते हैं।

इसका मूल रूप से मतलब है कि आप सभी सबस्क को कोड संदर्भों के रूप में हैश में डाल दें, और फिर उनको अपने लूप में कॉल करें। इस तरह आप नियंत्रित कर सकते हैं कि किसके लिए अनुमति है।

use strict; 
use warnings; 

sub baz { print "baz" } 

my %dispatch = (
    foo => sub { print "foo" }, 
    bar => sub { print "bar" }, 
    baz => \&baz, 
); 

my @arr = qw/foo bar baz wrong_entry/; 
foreach my $sub (@arr) { 
    die "$sub is not allowed" 
     unless exists $dispatch{$sub}; 

    $dispatch{$sub}->(); 
} 

यह आउटपुट:

foobarbaz 
wrong_entry is not allowed at /home/code/scratch.pl line 1494. 
+1

मैंने आदमी को एक मछली दी, आपने उसे मछली कैसे सिखाई। +1 – Zaid

+1

@Zaid ओह, दो और जवाब हैं। मैंने अभी तक उन्हें नहीं देखा।मैं यहाँ फिर से आधे ब्लॉग पोस्ट के नीचे हैकिंग व्यस्त था ...: डी – simbabque

+0

HI simbabque। धन्यवाद। मैं उसे नहीं जानता था। मेरे मामले में उपयोगकर्ता तर्कों में subroutine नाम प्रदान नहीं कर रहे हैं लेकिन अच्छी जानकारी। – Raj

7

आप कोड का उपयोग संदर्भ करना चाहते हैं।

foreach my $sub (@arr) 
{ 
    $sub->(); 
} 

जहां @arr scalars ऐसे

my $rc = sub { print "Anonymous subroutine\n" }; 

या

sub func { print "Named sub\n" } 
my $rc = \&func; 

के रूप में आप इन scalars में हेरफेर कर सकते हैं के रूप में आप किसी अन्य के लिए, अपने सरणी के रूप में हैं। हालांकि, यह हैश में मान के रूप में उनका उपयोग करने के लिए अधिक आम और उपयोगी है, प्रेषण तालिका बनाना।

कोड संदर्भ बनाने के लिए perlref देखें और this post भी सहायता कर सकता है।

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