निम्नलिखित पंक्ति का संभवतः क्या अर्थ हो सकता है? $ X एक स्थानीय पहले पैरामीटर सबरूटीन के लिए पारित करने के लिए आवंटित चर रहा है, हालांकि:पर्ल में शिफ्ट() क्या करता है?
my $x = shift;
निम्नलिखित पंक्ति का संभवतः क्या अर्थ हो सकता है? $ X एक स्थानीय पहले पैरामीटर सबरूटीन के लिए पारित करने के लिए आवंटित चर रहा है, हालांकि:पर्ल में शिफ्ट() क्या करता है?
my $x = shift;
यह आमतौर पर एक मुहावरा के लिए है।
my ($x) = @_;
(और यह तर्क सूची संशोधित नहीं करता है) शायद स्पष्ट है।
shift
फ़ंक्शन किसी सरणी से पहले तत्व को हटा देता है, और इसे वापस करता है। सरणी एक तत्व से छोटा है।
डिफ़ॉल्ट सरणी (अगर एक एक पैरामीटर के रूप नहीं दिया जाता है) @_
है अगर आप एक समारोह में हैं, या @ARGV
यदि आप फ़ाइल दायरे में कर रहे हैं।
तो इस मामले में $x
या तो पहले फ़ंक्शन पैरामीटर पर सेट किया जा रहा है, या पहले कमांड लाइन पैरामीटर पर सेट किया जा रहा है।
यह जोड़ा जाना चाहिए कि @_ एक फ़ंक्शन को दिए गए पैरामीटर वाले सरणी है, और @ARGV एक प्रोग्राम में दिए गए पैरामीटर वाले सरणी है। – Svante
यदि आप एक उपरोक्त में हैं तो @_
(पारित पैराम) पर shift
होगा।
तो $x
@_
सरणी से पहला आइटम popped
होगा।
तो आम तौर पर आप $x = shift if @_;
यदि के लिए कोई वास्तविक आवश्यकता नहीं है। "मेरा $ एक्स = शिफ्ट;" और "मेरा $ x; $ x = shift अगर @_;" समकक्ष हैं और यदि @_ खाली है, तो न ही दोनों एक्स $ अनिर्धारित होंगे, न ही या तो सख्त उल्लंघन करेंगे या चेतावनी उत्सर्जित करेंगे। केवल अंतर यह है कि आपको टाइपिंग की मात्रा है। –
shift()
देखना होगा है एक पर्ल सबरूटीन कि एक तर्क है, तो रिटर्न के रूप में एक सरणी लेता है और उस सरणी में पहला आइटम को हटा देता है में बनाया। shift
कॉल के साथ सबराउटिन में पारित सभी पैरामीटर प्राप्त करना सामान्य अभ्यास है। उदाहरण के लिए, कहें कि आपके पास subroutine foo
है जो तीन तर्क लेता है। एक तरह से इन मानकों स्थानीय चर के लिए असाइन किया पाने के लिए shift
इसलिए की तरह साथ है:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
भ्रम यहाँ ऐसा लगता है कि बदलाव एक तर्क के रूप एक सरणी पारित नहीं किया जा रहा है। वास्तव में, इसे "डिफ़ॉल्ट" सरणी को निहित रूप से पारित किया जा रहा है, जो एक सबराउटिन के अंदर @_
है या एक सबराउटिन के बाहर @ARGV
है।
या @ARGV, यदि आप किसी फ़ंक्शन में नहीं हैं (मेरा उत्तर देखें) – Alnitak
आप उपनाम के नाम के बाद '()' नहीं चाहते हैं - यह 'sub foo {...' होना चाहिए। '()' के साथ आप कह रहे हैं कि foo कोई तर्क स्वीकार नहीं करता है, जो आप इस मामले में – EvdB
में नहीं चाहते हैं, मैं 'sub foo {my ($ x, $ y, $ z) = @_} 'स्वयं का उपयोग करना पसंद करता हूं , यह कम दोहराव है। –
पर्ल में, यदि आप स्पष्ट रूप से तर्क निर्दिष्ट नहीं करते हैं तो कई विधियां डिफ़ॉल्ट चर ($_
और @_
) का उपयोग करती हैं।
my $x = shift @_;
जैसा कि पहले PullMonkey से कहा, एक सबरूटीन के भीतर, @_
तर्कों (perlsub
में वर्णित है) कि सबरूटीन के लिए पारित होता है: अपने कोड के समान है। shift
$x
में @_
से पहले तर्क मूल्य हटा कर उसे स्टोर करेगा, इसलिए $_[0]
अब आप दूसरा तर्क अपने सबरूटीन के लिए पारित दे देंगे।
, एक बहुत ही highlevel देखने से, पारी, एक सरणी (वाम-पंथी हिस्सा) के पहले तत्व ले जा रहा है, जबकि विपरीत पॉप जो सरणी के अंतिम तत्व (दायीं ले जा रहा है है अंश)।
my @array1=(5,6,7,8,9); my $x = shift @array1; print "$x\n"; # 5 print "@array1\n"; # 6 7 8 9
इससे कोई फर्क नहीं पड़ता कि उसने इसे गुगल किया है या नहीं।यह एक अच्छा सवाल है और निश्चित रूप से स्टैक ओवरफ़्लो डेटाबेस का हिस्सा होना चाहिए। – cowgod
@friedo - 100% से सहमत! यह "मेरे लिए दस्तावेज़ पढ़ें" साइट नहीं बनना चाहिए। –
'perldoc -f shift' में" perlfunc "से उपयोगी जानकारी है। [Perfun] देखें (http://perldoc.perl.org/perlfunc.html), या यहां तक कि [perlfun: shift()] (http://perldoc.perl.org/functions/shift.html)। उत्तर में से कोई भी दस्तावेज दस्तावेज से जोड़ने/खींचने का असली अच्छा काम नहीं करता है। तो, "आरटीएफएम" या नहीं, एक संदर्भ शामिल किया जाना चाहिए। –