पर्ल - सबरूटीन
पर्ल सबरूटीन या फ़ंक्शन स्टेटमेंट्स का एक समूह है जो एक साथ एक कार्य करता है। आप अपने कोड को अलग सबरूटीन्स में विभाजित कर सकते हैं। आप अपने कोड को विभिन्न सबरूटीन्स के बीच कैसे विभाजित करते हैं, यह आपके ऊपर है, लेकिन तार्किक रूप से विभाजन आमतौर पर ऐसा होता है कि प्रत्येक फ़ंक्शन एक विशिष्ट कार्य करता है।
पर्ल शब्दों का उपयोग उप-विधि, विधि और कार्य को एक दूसरे से करता है।
एक सबरूटीन को परिभाषित और कॉल करें
पर्ल प्रोग्रामिंग भाषा में एक सबरूटीन परिभाषा का सामान्य रूप निम्नानुसार है -
sub subroutine_name {
body of the subroutine
}
पेरल सबरूटीन को कॉल करने का विशिष्ट तरीका इस प्रकार है -
subroutine_name( list of arguments );
5.0 से पहले पर्ल के संस्करणों में, सबरूटीन्स को कॉल करने के लिए वाक्यविन्यास थोड़ा अलग था जैसा कि नीचे दिखाया गया है। यह अभी भी पर्ल के नवीनतम संस्करणों में काम करता है, लेकिन यह अनुशंसित नहीं है क्योंकि यह सबरूटीन प्रोटोटाइप को बायपास करता है।
&subroutine_name( list of arguments );
आइए निम्नलिखित उदाहरण पर एक नज़र डालें, जो एक सरल कार्य को परिभाषित करता है और फिर इसे कॉल करता है। क्योंकि पर्ल इसे निष्पादित करने से पहले आपके कार्यक्रम को संकलित करता है, इससे कोई फर्क नहीं पड़ता कि आप अपने सबरूटीन की घोषणा कहां करते हैं।
#!/usr/bin/perl
# Function definition
sub Hello {
print "Hello, World!\n";
}
# Function call
Hello();
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Hello, World!
एक सबरूटीन के लिए तर्क पारित करना
आप विभिन्न तर्कों को एक सबरूटीन को पास कर सकते हैं जैसे आप किसी अन्य प्रोग्रामिंग भाषा में करते हैं और उन्हें विशेष सरणी @_ का उपयोग करके फ़ंक्शन के अंदर एक्वायर्ड किया जा सकता है। इस प्रकार फ़ंक्शन का पहला तर्क $ _ [0] में है, दूसरा $ _ [1] में है, और इसी तरह।
आप सरणियों और हैश को किसी भी स्केलर की तरह तर्क के रूप में पारित कर सकते हैं, लेकिन एक से अधिक सरणी या हैश पास करने से सामान्य रूप से उनकी पहचान खो जाती है। इसलिए हम किसी भी सरणी या हैश को पारित करने के लिए संदर्भ (अगले अध्याय में समझाया गया) का उपयोग करेंगे।
आइए निम्नलिखित उदाहरण का प्रयास करें, जो संख्याओं की सूची लेता है और फिर उनका औसत प्रिंट करता है -
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n;
print "Average for the given numbers : $average\n";
}
# Function call
Average(10, 20, 30);
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Average for the given numbers : 20
सबरूटीन्स को पासिंग लिस्ट
क्योंकि @_ वैरिएबल एक सरणी है, इसका उपयोग सूचियों को एक सबरूटीन में आपूर्ति करने के लिए किया जा सकता है। हालांकि, जिस तरह से पर्ल सूचियों और सरणियों को स्वीकार करता है और पार्स करता है, उसके कारण व्यक्तिगत तत्वों को @_ से निकालना मुश्किल हो सकता है। यदि आपको अन्य अदिश तर्कों के साथ एक सूची पास करनी है, तो अंतिम तर्क के रूप में सूची नीचे दी गई है -
#!/usr/bin/perl
# Function definition
sub PrintList {
my @list = @_;
print "Given list is @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);
# Function call with list parameter
PrintList($a, @b);
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Given list is 10 1 2 3 4
सबरूटीन्स को हैशिंग पास करना
जब आप किसी सबरूटीन या ऑपरेटर को हैश की आपूर्ति करते हैं जो किसी सूची को स्वीकार करता है, तो हैश स्वचालित रूप से कुंजी / मूल्य जोड़े की सूची में अनुवादित हो जाता है। उदाहरण के लिए -
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach my $key ( keys %hash ) {
my $value = $hash{$key};
print "$key : $value\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Function call with hash parameter
PrintHash(%hash);
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
name : Tom
age : 19
एक सबरूटीन से रिटर्निंग वैल्यू
आप सबरूटीन से एक मान वापस कर सकते हैं जैसे आप किसी अन्य प्रोग्रामिंग भाषा में करते हैं। यदि आप सबरूटीन से मान नहीं लौटा रहे हैं, तो सबरूटीन में अंतिम गणना जो भी की जाती है वह स्वचालित रूप से रिटर्न मान है।
आप किसी भी स्केलर की तरह सबरटीन से एरेज़ और हैश वापस कर सकते हैं लेकिन एक से अधिक सरणी या हैश आमतौर पर उन्हें अपनी अलग पहचान खोने का कारण बनता है। तो हम किसी भी एरे या हैश को किसी फ़ंक्शन से वापस करने के लिए संदर्भ (अगले अध्याय में समझाया गया) का उपयोग करेंगे।
आइए निम्न उदाहरण का प्रयास करें, जो संख्याओं की सूची लेता है और फिर उनका औसत लौटाता है -
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n;
return $average;
}
# Function call
$num = Average(10, 20, 30);
print "Average for the given numbers : $num\n";
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Average for the given numbers : 20
एक सबरूटीन में निजी चर
डिफ़ॉल्ट रूप से, पर्ल के सभी चर वैश्विक चर हैं, जिसका अर्थ है कि उन्हें कार्यक्रम में कहीं से भी एक्सेस किया जा सकता है। लेकिन आप बना सकते हैंprivate चर कहा जाता है lexical variables किसी भी समय के साथ my ऑपरेटर।
myऑपरेटर किसी विशेष क्षेत्र के लिए एक चर को परिभाषित करता है जिसमें इसका उपयोग और उपयोग किया जा सकता है। उस क्षेत्र के बाहर, इस चर का उपयोग या उपयोग नहीं किया जा सकता है। इस क्षेत्र को इसका दायरा कहा जाता है। लेक्सिकल स्कोप आमतौर पर कोड का एक ब्लॉक होता है, जिसके चारों ओर ब्रेसिज़ होता है, जैसे कि सबरूटीन के शरीर को परिभाषित करने वाले या अगर, जबकि, फॉरचेट, और इवैल स्टेटमेंट के कोड ब्लॉक को चिह्नित करने वाले ।
निम्नलिखित एक उदाहरण आपको दिखा रहा है कि कैसे एक एकल या कई निजी चर का उपयोग करके परिभाषित किया जाए my ऑपरेटर -
sub somefunc {
my $variable; # $variable is invisible outside somefunc()
my ($another, @an_array, %a_hash); # declaring many variables at once
}
आइए वैश्विक और निजी चर के बीच अंतर करने के लिए निम्नलिखित उदाहरण देखें -
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
# Function definition
sub PrintHello {
# Private variable for PrintHello function
my $string;
$string = "Hello, Perl!";
print "Inside the function $string\n";
}
# Function call
PrintHello();
print "Outside the function $string\n";
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Inside the function Hello, Perl!
Outside the function Hello, World!
स्थानीय () के माध्यम से अस्थायी मान
localज्यादातर तब उपयोग किया जाता है जब किसी चर का वर्तमान मूल्य सबरूटीन्स कहलाता है। एक स्थानीय सिर्फ वैश्विक (मतलब पैकेज) चर को अस्थायी मान देता है। इसे डायनेमिक स्कूपिंग के रूप में जाना जाता है । लेक्सिकल स्कूपिंग मेरे साथ की जाती है, जो सी के ऑटो घोषणाओं की तरह काम करती है।
यदि एक से अधिक चर या अभिव्यक्ति स्थानीय को दी जाती है, तो उन्हें कोष्ठक में रखा जाना चाहिए। यह ऑपरेटर एक छिपे हुए स्टैक पर अपनी तर्क सूची में उन चर के मौजूदा मूल्यों को सहेजकर और उन्हें ब्लॉक, सबरूटीन, या निष्कासन से बाहर निकालने पर काम करता है।
आइए वैश्विक और स्थानीय चर के बीच अंतर करने के लिए निम्नलिखित उदाहरण देखें -
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
sub PrintHello {
# Private variable for PrintHello function
local $string;
$string = "Hello, Perl!";
PrintMe();
print "Inside the function PrintHello $string\n";
}
sub PrintMe {
print "Inside the function PrintMe $string\n";
}
# Function call
PrintHello();
print "Outside the function $string\n";
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!
राज्य के माध्यम से राज्य चर ()
एक अन्य प्रकार के शाब्दिक चर हैं, जो निजी चर के समान होते हैं, लेकिन वे अपने राज्य को बनाए रखते हैं और उन्हें उप-केंद्रों की कई कॉलों पर पुनर्निवेश नहीं मिलता है। इन चरों का उपयोग करके परिभाषित किया गया हैstate ऑपरेटर और Perl 5.9.4 से उपलब्ध है।
के उपयोग को प्रदर्शित करने के लिए आइए निम्न उदाहरण देखें state चर -
#!/usr/bin/perl
use feature 'state';
sub PrintCount {
state $count = 0; # initial value
print "Value of counter is $count\n";
$count++;
}
for (1..5) {
PrintCount();
}
जब उपरोक्त कार्यक्रम निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4
पर्ल 5.10 से पहले, आपको इसे इस तरह लिखना होगा -
#!/usr/bin/perl
{
my $count = 0; # initial value
sub PrintCount {
print "Value of counter is $count\n";
$count++;
}
}
for (1..5) {
PrintCount();
}
सबरूटीन कॉल प्रसंग
एक सबरूटीन या स्टेटमेंट के संदर्भ को वापसी मूल्य के प्रकार के रूप में परिभाषित किया गया है जो अपेक्षित है। यह आपको एक एकल फ़ंक्शन का उपयोग करने की अनुमति देता है जो उपयोगकर्ता प्राप्त करने की उम्मीद के आधार पर विभिन्न मूल्यों को लौटाता है। उदाहरण के लिए, निम्न स्थानीय समय () एक स्ट्रिंग लौटाता है जब इसे स्केलर संदर्भ में कहा जाता है, लेकिन यह एक सूची देता है जब इसे सूची के संदर्भ में कहा जाता है।
my $datestring = localtime( time );
इस उदाहरण में, $ टाइमस्टार का मूल्य अब वर्तमान तारीख और समय से बना एक तार है, उदाहरण के लिए, थू Nov 30 15:21:33 2000। इसके विपरीत -
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
अब व्यक्तिगत चर स्थानीय समय () सबरूटीन द्वारा लौटाए गए संबंधित मानों को समाहित करते हैं।