Perl में @_ का क्या अर्थ है?


जवाबों:


118

perldoc perlvar किसी भी विशेष-नामित पर्ल चर जानकारी की जांच करने वाला पहला स्थान है।

का हवाला देते हुए:

@_: एक सबरूटीन के भीतर सरणी @_में उस सबरूटीन को दिए गए पैरामीटर होते हैं।

अधिक विवरण perldoc perlsub (Perl subroutines) में perlvar से जुड़े पाए जा सकते हैं :

किसी भी तर्क सरणी में दिखाने के लिए पारित कर दिया @_

इसलिए, यदि आप दो तर्क के साथ एक समारोह कहा जाता है, उन में संग्रहीत किया जाएगा $_[0]और $_[1]

सरणी @_एक स्थानीय सरणी है , लेकिन इसके तत्व वास्तविक स्केलर मापदंडों के लिए उपनाम हैं । विशेष रूप से, यदि कोई तत्व $ _ [0] अपडेट किया जाता है, तो संबंधित तर्क अपडेट किया जाता है (या अपडेट योग्य नहीं होने पर कोई त्रुटि उत्पन्न होती है)।

यदि एक तर्क एक सरणी या हैश तत्व है जो फ़ंक्शन को कॉल करने पर मौजूद नहीं था, तो वह तत्व केवल तब बनाया जाता है जब (और यदि) इसे संशोधित किया जाता है या इसके लिए एक संदर्भ लिया जाता है। (पर्ल के कुछ पहले के संस्करणों ने तत्व बनाया या नहीं, तत्व को सौंपा गया था।) पूरे सरणी को असाइन करने पर @_ उस एलियासिंग को हटा देता है, और किसी भी तर्क को अपडेट नहीं करता है।


धन्यवाद, मैंने हाल ही में अपने आप को perldoc की जाँच करने का आदी बनाया है, और मैंने वेबपेजों को उपयोगी पाया है: perldoc.perl.org/perlvar.html यह वेब पर इसे लॉन्च करने वाले पर्ल स्टब बनाने के लिए बुरा नहीं था ... एक वेबपेज का प्रारूपण मुझे बहुत मदद करता है।
aschultz

27

आमतौर पर, आप वैरिएबल का उपयोग करके उप में दिए गए मापदंडों का विस्तार करते हैं @_:

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

इस तरह से सही होने का दावा किया है perlcritic


2
यह एक बार मैं असहमत हूं perlcritic, व्यक्तिगत रूप से मुझे लगता है कि यह एक समारोह के लिए सबसे अच्छा है, लेकिन एक विधि के लिए, यह shiftआत्म संदर्भ के लिए उपयोगी है , फिर @_सरणी को अनपैक करें । इससे यह स्पष्ट होता है कि यह एक विधि है और यह विधि कुछ मापदंडों
जोएल बर्जर

मुझे शायद पहले कभी भी PerLCritic के बारे में जाना / जाना चाहिए था, लेकिन मैंने ऐसा नहीं किया। इस उदाहरण में इसका उपयोग करने के लिए धन्यवाद। कभी-कभी आप जिस सामान का संदर्भ देते हैं, वह किसी को कुछ नया सीखने में मदद कर सकता है।
aschultz

12

खोज के लिएperl @_ पहला हिट यह कहता है :

@_ आने वाले मापदंडों की सूची एक उप है।

इसकी एक लंबी और अधिक विस्तृत व्याख्या भी है।


3
वास्तव में आपकी Google खोज की पहली हिट अब इसी पृष्ठ से जुड़ती है।
गेब्रियल दक्षिणी

... सात साल बाद, इंटरनेट के समय में एक अनंत काल। यही कारण है कि मैं दोनों पहले परिणाम से जुड़ा था और प्रासंगिक भाग को हटा दिया था: केवल Google पर निर्भर करता है बहुत भोली होगी।
पिस्कोर ने

1
यह सच है कि यह कई वर्षों बाद है, लेकिन यह जवाब देने के लिए अभी भी परेशान है कि आपको सवाल का जवाब देने के लिए Google चाहिए। Googling के परिणामस्वरूप उत्तर पढ़ने वाले किसी व्यक्ति के लिए यह व्यर्थ जानकारी है।
गैब्रियल दक्षिणी

2
हां खोज सही कदम है, लेकिन आपके उत्तर में खोज करने के लिए निर्देशों को शामिल करना आवश्यक नहीं है। यह अनावश्यक जानकारी है जो कोई मूल्य नहीं जोड़ता है, और यह विडंबना है क्योंकि यदि कोई आपके उत्तर में खोज लिंक का अनुसरण करता है तो यह उन्हें वापस लाता है जहां उन्होंने शुरू किया था।
गेब्रियल दक्षिणी

1
इन सभी "गूगल इट" के जवाबों ने इतनी बुरी तरह से वृद्ध किया है
ऑस्टिन एडम्स

11

सवाल था कि पर्ल में क्या @_ मतलब था । इस प्रश्न का उत्तर है कि है, जहां तक $_साधन यह पर्ल में, @_इसी तरह का मतलब है वे

किसी को भी इसके अर्थ के इस महत्वपूर्ण पहलू का उल्लेख नहीं किया गया है - साथ ही उनका भी

वे फलस्वरूप दोनों सर्वनाम के रूप में, या कभी-कभी सामयिक के रूप में उपयोग किए जाते हैं।

उनके पास आमतौर पर नाममात्र एंटीकेडेंट्स होते हैं, हालांकि हमेशा नहीं।


7

आप ज्यादातर मामलों में व्यक्तिगत चर के लिए बदलाव का उपयोग कर सकते हैं:

$var1 = shift;

यह एक ऐसा विषय है जिसमें आपको आगे शोध करना चाहिए क्योंकि पर्ल में आपकी उप दिनचर्या के अंदर बाहर की जानकारी हासिल करने के कई दिलचस्प तरीके हैं।


3
कूल, जिसने भी मुझे एक समान काम करने के लिए एक और तरीका पोस्ट करने के लिए डाउन वोट दिया। मुझे लगता है कि मैंने सीधे सवाल का जवाब नहीं दिया क्योंकि किसी ने पहले ही कर दिया था, लेकिन मैंने एक वैकल्पिक रूप पेश किया कि नए पर्ल प्रोग्रामर अक्सर भ्रमित होते हैं।
2

5

सभी पर्ल के "विशेष चर" को पेरलवर प्रलेखन पृष्ठ में सूचीबद्ध किया गया है ।


2

भले ही कोई फ़ंक्शन किसी सरणी को लौटाता है, लेकिन फ़ंक्शन को नीचे दिए गए किसी भी चर पर अपना लौटा डेटा निर्दिष्ट किए बिना कहा जाता है। यहां विभाजन () कहा जाता है, लेकिन यह किसी भी चर को नहीं सौंपा गया है। हम इसके डेटा को बाद में @_ के माध्यम से एक्सेस कर सकते हैं:

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

यह स्ट्रिंग को विभाजित करेगा $strऔर सरणी सेट करेगा @_


1

@ एक सरणी के लिए उपयोग किया जाता है।

एक सबरूटीन में या जब आप पर्ल में किसी फ़ंक्शन को कॉल करते हैं, तो आप पैरामीटर सूची पास कर सकते हैं। उस स्थिति में, @_फ़ंक्शन को पैरामीटर सूची पास करने के लिए उपयोग किया जा सकता है:

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

फंक्शन कॉल

Average(10, 20, 30);

यदि आप उपरोक्त कोड का निरीक्षण करते हैं, तो foreach $item(@_)लाइन देखें ... यहां यह इनपुट पैरामीटर पास करता है।


आपको हमेशा रहना चाहिए use strict। इसलिए मैंने आपका उप फ़ंक्शन संपादित किया।
सब कुछ

0

@_ चर को संपादित करने की कोशिश कभी नहीं !!!! उन्हें छुआ नहीं जाना चाहिए .. या आपको कुछ अनसुना प्रभाव मिलता है। उदाहरण के लिए...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

कॉल करने से पहले सब 1 $ आकार में 1234 होते हैं। लेकिन 500 (!!) के बाद आप इस मूल्य को संपादित नहीं करते हैं !!! आप दो या अधिक मान पास कर सकते हैं और उन्हें सबरूटीन में बदल सकते हैं और उन सभी को बदल दिया जाएगा! मैंने इस प्रभाव को कभी देखा नहीं है। जिन कार्यक्रमों को मैंने देखा है, वे @_ सरणी को आसानी से छोड़ देते हैं। और केवल यह कि आप सुरक्षित रूप से परिवर्तनशील हो सकते हैं परिवर्तनशील आंतरिक सबरूटीन नहीं बदला है आपको हमेशा ऐसा करना चाहिए:

sub sub2{
  my @m=@_;
  ....
}

स्थानीय सबरूटीन प्रक्रिया चर के लिए @_ असाइन करें और अगला उनके साथ काम किया। इसके अलावा कुछ गहरी पुनरावर्ती एल्गोरिदम में जो रेटुरुन सरणी है आप इस दृष्टिकोण का उपयोग स्थानीय संस्करणों के लिए उपयोग की जाने वाली स्मृति को कम करने के लिए कर सकते हैं। केवल अगर @_ समान लौटाएं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.