2012-03-20 13 views
17

perldocs कहना निम्नलिखित के बारे में last:पर्ल: grep या map से बाहर निकलने के लिए "आखिरी" क्यों उपयोग नहीं किया जाना चाहिए?

last एक ब्लॉक है कि एक मान देता है बाहर निकलने के लिए नहीं किया जा सकता इस तरह के eval {}, sub {}, या do {}, और एक ग्रेप बाहर निकलने के लिए नहीं किया जाना चाहिए() या नक्शे के रूप में() ऑपरेशन।

क्यों यह एक ग्रेप में बचा जाना चाहिए() या नक्शा()? मैं विशेष रूप से मानचित्र के बारे में उत्सुक हूं क्योंकि यह foreach निर्माण का विकल्प है। दस्तावेज़ परिणामों के वर्णन किए बिना कुछ नहीं करने पर जोर देते हैं।

+3

नक्शा एक सूची को दूसरी सूची में बदल देता है, इसलिए प्रत्येक मानचित्र आमंत्रण को – perreal

+0

तत्व को वापस लेना चाहिए। मुझे 'लूप ब्लॉक' के बाहर 'लापता ब्लॉक' के बाहर 'पिछला' के साथ 'पिछला' के साथ बाहर निकलने का प्रयास करने में त्रुटि नहीं हो सकती है। WinXP में 14.1। – TLP

+0

@ टीएलपी: और यह मामला कम से कम पर्ल v5.10.1 के बाद से किया गया है। मुझे लगता है कि यह "नहीं होना चाहिए" भाषा पर्ल के कुछ पुराने संस्करण से होल्डओवर है जब यह कुछ अजीब व्यवहार का कारण बनता है। – ruakh

उत्तर

8

सबसे पहले, पता है कि grep और mapnext, last और redo लिए पारदर्शी होते हैं, if है जैसे।

$ perl -e' 
    print "A"; 
    for (8,9) { 
     print "B"; 
     print map { print "C"; next; print "D"; $_ } 1,2,3; 
     print "E"; 
    } 
    print "F\n"; 
' 
ABCBCF 

लेकिन डॉक्स कहना नहीं है lastmap बाहर निकलने के लिए नहीं इस्तेमाल किया जा सकता है, यह इसके नहीं इस्तेमाल किया जाना चाहिए कहते हैं। यह स्पष्ट नहीं है कि इसका क्या अर्थ है।

  • उनका उपयोग न करें कि वे map और grep को प्रभावित करेंगे?
  • उन तरीकों का उपयोग न करें क्योंकि आपके पाठक को लगता है कि वे map और grep को प्रभावित करते हैं?
  • उन तरीकों का उपयोग न करें क्योंकि यह एक भद्दा राज्य में पर्ल छोड़ सकता है?
  • उन तरीकों का उपयोग न करें क्योंकि व्यवहार भविष्य में बदल सकता है?

मुझे नहीं पता।

मैं यह # 3 है क्योंकि मैं next, last और redo का उपयोग कर एक map या grep कॉलबैक छोड़ने के लिए में से किसी बुरा दुष्प्रभाव के पता नहीं है नहीं लगता।

एक लूप निर्माण का उपयोग करके map और grep छोड़कर मजाकिया बात यह भी चेतावनी नहीं देती है कि एक ही फैशन में एक उप छोड़कर भी चेतावनी नहीं दी जाती है।

$ perl -wE'while (1) { map { last; } 1; }' 

$ perl -wE'while (1) { sub { last; }->(); }' 
Exiting subroutine via last at -e line 1. 
+2

मुझे यकीन है कि इरादा यह है कि 'अंतिम' (और 'अगली') का उपयोग 'map' या' grep' में अंतर्निहित पाश से बाहर निकलने के लिए नहीं किया जाना चाहिए क्योंकि यह वास्तव में * युक्त ब्लॉक * से बाहर निकलता है। विशेष रूप से ध्यान दें कि फ़ाइल स्तर पर 'अंतिम' अवैध होने पर, 'प्रिंट "ए"; प्रिंट मानचित्र {प्रिंट "बी"; पिछले; प्रिंट "सी";} 1,2,3; प्रिंट करें "जेड"; प्रिंट केवल 'एबी' प्रिंट करता है और इसलिए पूरे कार्यक्रम से बाहर निकलता है। निचली पंक्ति यह है कि 'मानचित्र' एक सूची से दूसरे में एक * मैपिंग * प्रदान करता है और ** ** नहीं है, जैसा कि ओपी ने कहा, 'foreach' के लिए एक विकल्प। – Borodin

+0

@ बोरोडिन, रे "क्योंकि यह वास्तव में एक युक्त ब्लॉक से बाहर निकलता है", मैंने उल्लेख किए गए संभावित * व्याख्याओं में से एक है। ऐसा नहीं है कि डॉक्स दस्तावेज़ वास्तव में * कहें *, और आप अपने दावे को वापस करने के लिए बिल्कुल कोई सबूत नहीं देते हैं जो निश्चित रूप से सही व्याख्या होना चाहिए। पुन: "विशेष रूप से ध्यान दें", फिर दस्तावेज राज्य 'if'' के बाहर निकलने के लिए 'आखिरी' का उपयोग क्यों नहीं करता है? यह "युक्त ब्लॉक" से भी बाहर निकलता है। आप मेरे दावे का खंडन कर रहे हैं कि इरादा स्पष्ट रूप से बताकर स्पष्ट नहीं है कि यह स्पष्ट है। मैं असम्पीडित हूँ। आपकी टिप्पणी का मुद्दा क्या था? – ikegami

+4

आपको अपने आक्रामकता और व्यापकता पर काम करना चाहिए। मैंने जो कहा वह था कि मैं दस्तावेज के इरादे से निश्चित हूं। हां यह आपके विकल्पों में से एक था। मैंने इस पर टिप्पणी नहीं की कि दस्तावेज़ीकरण का अर्थ स्पष्ट था या नहीं। मैं आपसे असहमत नहीं था। कृपया शांत हो जाएं। – Borodin

7

map दूसरे करने के लिए मानचित्रण एक सूची के लिए है। यह निश्चित रूप से foreach का विकल्प नहीं है। मैं की तरह

map { print "$_\n" } @data; 

जो अपने दुष्प्रभाव के लिए map का उपयोग करने और दूर जिसके परिणामस्वरूप सूची फेंकने के पाप करता है भी अक्सर बातें देखा है। आप

my $x = 99; 
sqrt(my $y = $x * $x); 
print $y; 

का उपयोग करने पर विचार नहीं करेंगे और आपको एक चेतावनी मिलेगी।इसी कारण से आप map का उपयोग नहीं करते हैं जब आपका मतलब for है।

एक व्यावहारिक कारण से, पर विचार

print "A"; 
print map { print "B"; last; print "C";} 1,2,3; 
print "Z"; 

आउटपुट

AB 

इसलिए इस मामले में last पूरे कार्यक्रम बाहर निकालता है। सामान्य, एक map या grep ब्लॉक के अंदर last या next का उपयोग करने में ब्लॉक युक्त बाहर निकल जाता है, अगर वहाँ एक है, अन्यथा पूरे कार्यक्रम। यह कुछ बचा जाना है, इसलिए "last ... किसी grep() या map() ऑपरेशन से बाहर निकलने के लिए उपयोग नहीं किया जाना चाहिए"

+0

मेरा मतलब वैकल्पिक वैकल्पिक सूची जनरेटर था, जैसे * [डॉक्स] (http://perldoc.perl.org/functions/map.html) * कहें '% हैश = मानचित्र {foo ($ _) => $ _ } @array; '' हैश =() के लिए एक विकल्प है; foreach (@array) {$ हैश {foo ($ _)} = $ _; } ' – vol7ron

+0

जब आप शून्य संदर्भ में 'मानचित्र' का उपयोग करते हैं तो फेंकने के लिए कोई परिणाम नहीं" स्ट्रिंग "होता है, इसलिए आपका पहला तर्क मोटे तौर पर त्रुटिपूर्ण होता है। – ikegami

+2

आपका दूसरा तर्क समान रूप से त्रुटिपूर्ण है। लोग 'func (my $ y = EXPR)' हर समय करते हैं: 'chomp (मेरा $ x = <>);' utf8 :: डीकोड (मेरा $ डीकोडेड = $ एन्कोड किया गया); 'उनमें से दोनों को भी मूल्य वापस आते हैं , जो शून्य संदर्भ में 'मानचित्र' के लिए एक से अधिक कह सकता है! – ikegami

2

पर्ल में, for/foreach, grep, और map के बीच कार्यक्षमता की एक सभ्य मात्रा ओवरलैप है। हालांकि, सिर्फ इसलिए कि संभावित रूप से उन सभी समस्याओं का समाधान करने के लिए उपयोग कर सकते हैं, इसका मतलब यह नहीं है कि वे उस विशेष नौकरी के लिए सबसे अच्छा उपकरण हैं (देखें: एक स्क्रूड्राइवर का उपयोग करके एक नाखून पाउंड करने के लिए)।

  • grep: इसका उद्देश्य एक सूची को फ़िल्टर और जिसके परिणामस्वरूप सबसेट वापस जाने के लिए है।
  • map: इसका उद्देश्य सूची को संशोधित करना और परिणामी संशोधित सूची को संशोधित करना है।
  • for/foreach: इसका उद्देश्य एक सूची के माध्यम से पुन: प्रयास करना है और कुछ करें।

अब, आप for/foreach साथ grep और map के हर उपयोग पूरा कर सकते हैं। grep और map मूल रूप से सूची प्रसंस्करण (for/foreach) के विशिष्ट उपयोगों के लिए सिंटैक्टिक चीनी हैं जो विशेष रूप से आम और उपयोगी हैं। डिजाइन द्वारा, सम्मेलन द्वारा, और सर्वोत्तम प्रथाओं से, वे कुछ चीजों को बढ़ती सुविधा और स्पष्टता के लिए व्यापार करते हैं।

उन चीजों में से एक यह है कि grep और map एक मूल्य वापस करने का इरादा है। शून्य संदर्भ में उनका उपयोग निराश हो गया है, और बेवकूफ पर्ल का उल्लंघन करने के लिए माना जाता है। यदि आप कोई मान नहीं दे रहे हैं, तो for/foreach का उपयोग करें। यदि आप एक मान वापस कर रहे हैं, तो last उस प्रक्रिया को बाधित करता है।

यदि आप पर्ल के लिए सर्वोत्तम प्रथाओं का पालन कर रहे हैं, तो grep और map का उपयोग हमेशा एक मान लौटाएगा, जिसका अर्थ है कि last का उपयोग करना चाहिए।

+0

+1। मुझे यकीन नहीं है कि पर्ल के पास कोई आधिकारिक * सर्वोत्तम प्रथाएं * है, लेकिन मेरा मानना ​​है कि डेमियन कॉनवे करता है :) उनके ज्यादातर अंक आमतौर पर अधिकांश प्रोग्रामिंग भाषाओं में स्वीकार किए जाते हैं। हालांकि, सावधान रहें। उन्होंने बिना किसी व्यक्तिगत वरीयता अंक डाले हैं कि यह व्यक्तिगत वरीयता है। – vol7ron

+0

पर्ल में ** आधिकारिक ** सर्वोत्तम प्रथाएं नहीं हो सकती हैं, लेकिन यह डेमियन कॉनवे की पुस्तक से केवल सर्वोत्तम प्रथा नहीं है। आपको "प्रोग्रामर पर्ल] (http://shop.oreilly.com/product/9780596004927.do)" के चौथे संस्करण में, "[मूल पोस्टर द्वारा उद्धृत) परल्डफोक्स में वही अनुशंसा दिखाई देगी," और "[ प्रभावी पर्ल प्रोग्रामिंग] (http://www.effectiveperlprogramming.com/), दूसरा संस्करण "। सभी मानते हैं, मैं कहूंगा कि इसे करीब के करीब बनाता है क्योंकि पर्ल आधिकारिक सर्वोत्तम प्रथाओं तक पहुंच जाता है। ;-) –

+0

मैंने कभी जवाब नहीं दिया, लेकिन आप पाएंगे कि वे सभी लोग पर्ल कोर में योगदानकर्ता हैं या परियोजनाओं पर एक साथ काम करते हैं। वे पर्ल समुदाय के सभी सम्मानित सदस्य हैं और * सर्वोत्तम * प्रथाओं की एक ही अनौपचारिक सूची पर प्रभाव पड़ा है। बस महसूस करें कि वे सभी O'Reilly द्वारा प्रकाशित हैं और सिर्फ इसलिए कि एक या दो सहमत हैं, उन्हें जरूरी नहीं है * सर्वोत्तम *। यदि आप कहीं और देखते हैं, तो आप पाएंगे कि उनके कुछ तथाकथित प्रथाओं में बग का कारण बनता है। फिर भी, TMTOWTDI से दूर जाना और एक लोकप्रिय शैली और सम्मेलन का उपयोग करना सबसे अच्छा है। --- इसके अलावा, यह ध्यान रखना चाहता था कि मैं ओपी था। – vol7ron

संबंधित मुद्दे