आपका कोड सामान्य रूप में सही है, लेकिन आप पर्ल आप कोड 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.
'(\ & $ नाम) -> (@ args)' – ikegami