पर्ल में, @_
में संग्रहीत सबराउटिन तर्क हमेशा कॉल साइट पर मानों के लिए उपनाम होते हैं। यह एलियासिंग केवल @_
में बनी रहती है, यदि आप मूल्यों की प्रतिलिपि बनाते हैं, तो आपको वही मिलता है, मान।
इस उप में तो
:
sub example {
# @_ is an alias to the arguments
my ($x, $y, @rest) = @_; # $x $y and @rest contain copies of the values
my $args = \@_; # $args contains a reference to @_ which maintains aliases
}
ध्यान दें कि यह अलियासिंग सूची में विस्तार के बाद होता है, इसलिए यदि आप example
को एक सरणी पारित कर दिया, सरणी सूची संदर्भ में फैलता है, और @_
प्रत्येक तत्व के अन्य नामों पर सेट किया गया है सरणी का (लेकिन सरणी स्वयं example
पर उपलब्ध नहीं है)। यदि आप उत्तरार्द्ध चाहते थे, तो आप सरणी के संदर्भ को पारित करेंगे।
सबराउटिन तर्कों का एलिसिंग एक बहुत ही उपयोगी विशेषता है, लेकिन देखभाल के साथ इसका उपयोग किया जाना चाहिए। बाह्य चर के अनपेक्षित संशोधन को रोकने के लिए, पर्ल 6 में आपको यह निर्दिष्ट करना होगा कि आप is rw
के साथ लिखने योग्य एलियाज्ड तर्क चाहते हैं।
my $slice = sub {\@_}->(@somearray[3 .. 10]);
यह भी है कि करने के लिए sub {\@_}->(LIST)
का उपयोग कर पता चला:
कम ज्ञात लेकिन उपयोगी चाल में से एक उपनाम
my ($x, $y) = (1, 2);
my $alias = sub {\@_}->($x, $y);
$$alias[1]++; # $y is now 3
की सरणी refs या एलियास स्लाइस बनाने के लिए इस अलियासिंग सुविधा का उपयोग करने है सूची से एक सरणी बनाना वास्तव में
[ LIST ]
से तेज़ है क्योंकि पर्ल को प्रत्येक मान की प्रतिलिपि बनाने की आवश्यकता नहीं है। निस्संदेह नकारात्मक (या आपके परिप्रेक्ष्य के आधार पर उल्टा) यह है कि मूल्य अलियाकृत रहते हैं, इसलिए आप मूल को बदलने के बिना उन्हें बदल नहीं सकते हैं।
रूप tchrist एक और जवाब देने के लिए एक टिप्पणी में उल्लेख है, आप पर्ल के अलियासिंग निर्माणों में से किसी का उपयोग करते हैं @_
पर, $_
वे प्रदान है कि आप भी मूल सबरूटीन तर्कों को एक उपनाम है। जैसे:
sub trim {s!^\s+!!, s!\s+$!! for @_} # in place trimming of white space
अन्त में सभी इस व्यवहार का nestable है, इसलिए जब एक और सबरूटीन का तर्क सूची में @_
का उपयोग कर (या इसे का एक टुकड़ा), यह भी पहली सबरूटीन के तर्कों को उपनाम हो जाता है:
sub add_1 {$_[0] += 1}
sub add_2 {
add_1(@_) for 1 .. 2;
}
पर्ल सी नहीं है। सी की तरह व्यवहार करने की अपेक्षा न करें, या सी ++ या जावा जैसी सी-व्युत्पन्न भाषा। –
[perldoc perlsub] (http://perldoc.perl.org/perlsub.html) – Ether
आपका प्रश्न '@ _',' _ _' नहीं है। और 'उप' में '@ _' में अक्सर मानों की प्रतियों के बजाय उपनाम होते हैं। इसलिए यदि आप इस व्यवहार को अपने 'उप' में नहीं चाहते हैं, तो शुरुआत में '@ _' से' my' चर से इनपुट कॉपी करना सुनिश्चित करें। – aschepler