2008-11-17 13 views
64

निम्नलिखित पंक्ति का संभवतः क्या अर्थ हो सकता है? $ X एक स्थानीय पहले पैरामीटर सबरूटीन के लिए पारित करने के लिए आवंटित चर रहा है, हालांकि:पर्ल में शिफ्ट() क्या करता है?

my $x = shift; 
+32

इससे कोई फर्क नहीं पड़ता कि उसने इसे गुगल किया है या नहीं।यह एक अच्छा सवाल है और निश्चित रूप से स्टैक ओवरफ़्लो डेटाबेस का हिस्सा होना चाहिए। – cowgod

+6

@friedo - 100% से सहमत! यह "मेरे लिए दस्तावेज़ पढ़ें" साइट नहीं बनना चाहिए। –

+0

'perldoc -f shift' में" perlfunc "से उपयोगी जानकारी है। [Perfun] देखें (http://perldoc.perl.org/perlfunc.html), या यहां तक ​​कि [perlfun: shift()] (http://perldoc.perl.org/functions/shift.html)। उत्तर में से कोई भी दस्तावेज दस्तावेज से जोड़ने/खींचने का असली अच्छा काम नहीं करता है। तो, "आरटीएफएम" या नहीं, एक संदर्भ शामिल किया जाना चाहिए। –

उत्तर

2

यह आमतौर पर एक मुहावरा के लिए है।

my ($x) = @_; 

(और यह तर्क सूची संशोधित नहीं करता है) शायद स्पष्ट है।

14

shift फ़ंक्शन किसी सरणी से पहले तत्व को हटा देता है, और इसे वापस करता है। सरणी एक तत्व से छोटा है।

डिफ़ॉल्ट सरणी (अगर एक एक पैरामीटर के रूप नहीं दिया जाता है) @_ है अगर आप एक समारोह में हैं, या @ARGV यदि आप फ़ाइल दायरे में कर रहे हैं।

तो इस मामले में $x या तो पहले फ़ंक्शन पैरामीटर पर सेट किया जा रहा है, या पहले कमांड लाइन पैरामीटर पर सेट किया जा रहा है।

+7

यह जोड़ा जाना चाहिए कि @_ एक फ़ंक्शन को दिए गए पैरामीटर वाले सरणी है, और @ARGV एक प्रोग्राम में दिए गए पैरामीटर वाले सरणी है। – Svante

0

यदि आप एक उपरोक्त में हैं तो @_ (पारित पैराम) पर shift होगा।
तो $x@_ सरणी से पहला आइटम popped होगा।

तो आम तौर पर आप $x = shift if @_;

+2

यदि के लिए कोई वास्तविक आवश्यकता नहीं है। "मेरा $ एक्स = शिफ्ट;" और "मेरा $ x; $ x = shift अगर @_;" समकक्ष हैं और यदि @_ खाली है, तो न ही दोनों एक्स $ अनिर्धारित होंगे, न ही या तो सख्त उल्लंघन करेंगे या चेतावनी उत्सर्जित करेंगे। केवल अंतर यह है कि आपको टाइपिंग की मात्रा है। –

52

shift() देखना होगा है एक पर्ल सबरूटीन कि एक तर्क है, तो रिटर्न के रूप में एक सरणी लेता है और उस सरणी में पहला आइटम को हटा देता है में बनाया। shift कॉल के साथ सबराउटिन में पारित सभी पैरामीटर प्राप्त करना सामान्य अभ्यास है। उदाहरण के लिए, कहें कि आपके पास subroutine foo है जो तीन तर्क लेता है। एक तरह से इन मानकों स्थानीय चर के लिए असाइन किया पाने के लिए shift इसलिए की तरह साथ है:

sub foo() { 
    my $x = shift; 
    my $y = shift; 
    my $z = shift; 
    # do something 
} 

भ्रम यहाँ ऐसा लगता है कि बदलाव एक तर्क के रूप एक सरणी पारित नहीं किया जा रहा है। वास्तव में, इसे "डिफ़ॉल्ट" सरणी को निहित रूप से पारित किया जा रहा है, जो एक सबराउटिन के अंदर @_ है या एक सबराउटिन के बाहर @ARGV है।

+0

या @ARGV, यदि आप किसी फ़ंक्शन में नहीं हैं (मेरा उत्तर देखें) – Alnitak

+1

आप उपनाम के नाम के बाद '()' नहीं चाहते हैं - यह 'sub foo {...' होना चाहिए। '()' के साथ आप कह रहे हैं कि foo कोई तर्क स्वीकार नहीं करता है, जो आप इस मामले में – EvdB

+3

में नहीं चाहते हैं, मैं 'sub foo {my ($ x, $ y, $ z) = @_} 'स्वयं का उपयोग करना पसंद करता हूं , यह कम दोहराव है। –

6

पर्ल में, यदि आप स्पष्ट रूप से तर्क निर्दिष्ट नहीं करते हैं तो कई विधियां डिफ़ॉल्ट चर ($_ और @_) का उपयोग करती हैं।

my $x = shift @_; 

जैसा कि पहले PullMonkey से कहा, एक सबरूटीन के भीतर, @_ तर्कों (perlsub में वर्णित है) कि सबरूटीन के लिए पारित होता है: अपने कोड के समान है। shift$x में @_ से पहले तर्क मूल्य हटा कर उसे स्टोर करेगा, इसलिए $_[0] अब आप दूसरा तर्क अपने सबरूटीन के लिए पारित दे देंगे।

0
एक आम आदमी की भाषा में

, एक बहुत ही highlevel देखने से, पारी, एक सरणी (वाम-पंथी हिस्सा) के पहले तत्व ले जा रहा है, जबकि विपरीत पॉप जो सरणी के अंतिम तत्व (दायीं ले जा रहा है है अंश)।

 
my @array1=(5,6,7,8,9); 
my $x = shift @array1; 
print "$x\n"; # 5 
print "@array1\n"; # 6 7 8 9 
संबंधित मुद्दे