2009-02-20 17 views
6

पर्ल में, एक बार, नियंत्रण ब्लॉकों का उपयोग कर से बचने कर सकते इस तरह:संक्षिप्त foreach अभिव्यक्ति

print "$_\n" foreach(@files); 

के बजाय:

foreach(@files){ 
    print "$_\n"; 
} 

कैसे निम्नलिखित में इस वाक्य काम करता है और अधिक, जटिल मामला:

die("Not a file: $_") unless -f $_ foreach(@files); 

यह मुझे एक वाक्यविन्यास त्रुटि देता है। मैं obfuscated कोड लिखने की कोशिश नहीं कर रहा हूँ, यह कार्यक्रम में सिर्फ एक महत्वहीन हिस्सा है, और इसलिए मैं इसे यथासंभव संक्षेप में व्यक्त करना चाहता हूं।

संक्षेप जवाब:

मैं स्वीकार किए जाते हैं जवाब के रूप में केवल एक ही जवाब स्वीकार कर सकते हैं, लेकिन मैं क्रिस और जॉन सबसे अच्छा से निम्नलिखित लोगों की तरह।

यह एक foreach के रूप में मैं इरादा का उपयोग करता है, लेकिन syntax error बिना:

-f or die "Not a file: $_" foreach @files; 

और निम्न में से एक कम से कम के रूप में अच्छा है। मुझे पसंद है कि die बयान की शुरुआत में है, क्योंकि है कि क्या पाठक का ध्यान आकर्षित निर्देशित किया जाना चाहिए की ओर:

die("Not a file: $_") for grep {!-f} @files; 
+0

मैं मानता हूं कि लाइन की शुरुआत में 'मर() 'सबसे अच्छा है, लेकिन चुटकी में, शॉर्ट-सर्किट तर्क मेरे लिए उतना ही पठनीय है। –

+1

क्या आप बस गोल्फिंग कर रहे हैं? अन्यथा, इसे एक पंक्ति पर रखना क्यों महत्वपूर्ण है? –

उत्तर

12

बस Perlish (TMTOWTDI) आप तर्क शॉर्ट सर्किट का उपयोग कर सकते हो।

एक तरफ ध्यान दें के रूप में, -f or die लाइन के इरादे से पता चलता आम open() or die निर्माणों मैं पर्ल में देखते हैं, और अभी भी (मुझे लगता है कि) का एक बहुत की तरह लग रहा (कुछ शर्तों के अधीन die के लिए)।

+1

बहुत साफ है। स्विस सेना चेनसॉ के लिए ++ और हुरेय! –

+0

मुझे यह पसंद है। खुले() या मरने() के साथ समानांतर थोड़ा सा है, क्योंकि खुले() के उद्देश्य आमतौर पर एक फाइल को खोलने के लिए नहीं होता है()। लेकिन यदि आप उपर्युक्त कोड के उद्देश्य के बारे में सोचते हैं तो फ़ाइल के अस्तित्व का परीक्षण करना है, समानांतर सटीक है। कठिन कॉल, लेकिन मुझे लगता है कि मैं तुम्हारा एक स्पर्श अधिक पसंद करता हूं। ;-) –

7

ठीक है, आप इच्छुक समझ से परे कोड लिखने के लिए नहीं हो सकता है, लेकिन मैं कहना चाहता हूँ कि आप निश्चित रूप से पर कोशिश कर रहा है।

क्या दो लाइनें (या एक लाइन पर भी एक ब्लॉक, जैसे ब्रेंट। लोंगबोरो सुझाव देता है) एक के बदले इतना बुरा हो सकता है? ईमानदारी से, यही कारण है कि मैं आम तौर पर अन्य लोगों के पर्ल कोड को डीबग/संपादित करने की कोशिश करने से नफरत करता हूं, पर्ल में लिखने वाले लोगों की एक बड़ी संख्या इसे "चालाक" तरीके से लगभग हर चीज करने के बजाय भ्रमित लगती है, इसे करने के बजाय इस तरह से किसी और को पढ़ने के लिए समझना आसान है।

+0

+1। मैंने कभी नहीं समझा कि कुछ लोगों के लिए "केवल एक पंक्ति में clevver ==" क्यों। – innaM

+1

मुझे लगता है कि कुछ उदाहरण (जैसे 'grep' का उपयोग करने वाले) "चालाक" हैं, लेकिन इसलिए नहीं कि वे केवल एक पंक्ति हैं। वे चालाक हैं क्योंकि वे सिर्फ एक पंक्ति हैं, लेकिन स्पष्ट रूप से अर्थ दिखाते हैं। और यह अच्छा लगता है - एक पंक्ति पर घोंसला वाले कोष्ठक और ब्रैकेट खराब दिखते हैं (मेरी राय में (लिस्प (हाहा) को छोड़कर))। –

3

यदि आप obfuscated कोड लिखने की कोशिश नहीं कर रहे हैं, तो आपको इसे इस तरह लिखने की कोशिश नहीं करनी चाहिए। आप ऐसा कुछ ले रहे हैं जो सरल होना चाहिए और इसे समझना मुश्किल हो।

+1

इस बारे में क्या परेशान है? आप इसे कैसे लिखेंगे? – Svante

+0

मैं हरलेकिन से सहमत हूं - इस पृष्ठ पर कई उत्तरों से पता चलता है कि यह लिखने के तरीके हैं जो दोनों हैं) स्पष्ट और बी) एक पंक्ति। –

+0

मैं अपनी टिप्पणी का जवाब दे रहा था कि "मैं obfuscated कोड लिखने की कोशिश नहीं कर रहा हूं।" वेबस्टर द्वारा परिभाषित किए गए उनके प्रयास को अपमानित किया गया था: "उत्पीड़ित, अस्पष्ट या भ्रमित होने के लिए"। जब मैंने पोस्ट किया था तो प्रतिक्रियाएं अस्पष्ट और उलझन में थीं, जबकि बाद में पोस्ट किए गए कुछ उदाहरण ठीक दिखते थे। – gpojd

11

आप या तो इस्तेमाल कर सकते हैं @ Brent.Longborough का जवाब, या यदि आप वास्तव में पोस्टफ़िक्स चाहते हैं, करते हैं:

do { die("Not a file: $_") unless -f $_ } foreach(@files); 

हालांकि, मैं अन्य लोगों के साथ सहमति व्यक्त करते हैं, सिर्फ इसलिए कि यह "एक महत्वहीन हिस्सा" नहीं है मतलब है कि संक्षिप्त बेहतर है। पठनीयता की गणना करता है।

+0

यह कैसे पठनीय नहीं है? आप इसे कैसे लिखना पसंद करेंगे? – Svante

+0

मैंने यह नहीं कहा कि यह "पठनीय नहीं है।" हालांकि, मैं जोर देता हूं कि यह जंजीर पोस्टफिक्स नियंत्रण संरचनाओं का उपयोग करने के लिए * कम * पठनीय है। यह निश्चित रूप से व्यक्तिपरक है। मुद्दा यह है कि ओपी ने यह नहीं कहा कि वह पठनीयता को अधिकतम करने की कोशिश कर रहा था, लेकिन यह "संक्षिप्त" होना चाहिए क्योंकि यह "महत्वहीन" था। –

5

यदि त्रुटि परीक्षण इस कोड का प्राथमिक बिंदु है, तो यह लाइन की शुरुआत में प्रमुख स्थान होने के लिए समझ में आ सकता है। एक मामूली सुधार grep उपयोग करने के लिए होगा:

die("Not a file: $_") for grep {!-f} @files; 

लेकिन अगर आप कोड के उस हिस्से में किसी अन्य कारण से फ़ाइलों के माध्यम से पाशन पर योजना है, यह लूप के शरीर में जोड़ने के लिए बेहतर होगा।

0

डैन, जॉन ने मुझे grep पर मार दिया।

लेकिन मेरे पास एक बड़ा सवाल है: यदि आप अपने सरणी में कुछ गैर-फाइलें पा रहे हैं तो वास्तव में यह जरूरी नहीं है कि आप कैसे जमानत में जा रहे हैं? (उन वस्तुओं को हटाने, उपयोगकर्ता को चेतावनी देने और फिर बाकी सूची को संसाधित करने के विरोध में।) मुझे लगता है कि पूरे शेबांग को मारना कार्यक्रम का एक महत्वपूर्ण हिस्सा है।

किसी भी मामले में, आप पोस्टफिक्स संशोधक के साथ बिल्कुल वही नहीं कर सकते हैं क्योंकि आप उनमें से केवल एक ही चीज़ कर सकते हैं। तो आपके पास unless और foreach दोनों नहीं हो सकते हैं।

किसी भी सरल बयान वैकल्पिक रूप से ठीक पहले समाप्त अर्धविराम (या ब्लॉक समाप्त), एक एकमात्र संशोधक के द्वारा पीछा किया जा सकता है: perldoc perlsyn के प्रासंगिक बिट के ऊपर से।

-f or die "Not a file: $_" foreach @files; 

ओएस एक्स और काम करता है पर परीक्षण किया गया:

+0

हाँ। अगर यह सिर्फ एक प्रिंट था, तो मैं कहूंगा कि पारंपरिक नोटेशन बेहतर है। लेकिन संभवतः यदि संभव हो तो लाइन पर पहला टोकन होना चाहिए। –

-2

आप बहुत मर चुके हैं।

Your maintenance programmer http://www.codinghorror.com/blog/images/carny.jpg

मुझे आशा है कि वह तुम्हें कभी नहीं पाता है। लेकिन आपको think about him whenever you code होना चाहिए।

+0

एक बेहतर, लेकिन कम चौंकाने वाला, लिंक किए गए आलेख से उद्धरण: "वैकल्पिक रूप से, हमेशा कोड और टिप्पणी इस तरह से करें कि अगर कोई कुछ जूनियर जूनियर कोड उठाता है, तो उसे पढ़ने और सीखने में खुशी होगी । " - http://c2.com/cgi/wiki?CodeForTheMaintainer –

1

आप बहुत मेहनत कर रहे हैं। यहाँ यह कोई कलाबाजी के साथ एक पंक्ति में है:

foreach (@files) { die("Not a file!") unless -f } 

आप इसे गोल्फ नीचे करने के लिए ब्लॉक के अंदर सामान के साथ चारों ओर खेलने सकता है, लेकिन कोष्ठक और ब्रेसिज़ को हटाने आप किसी भी मदद नहीं कर रहा है, और शायद जा रहा है अगले प्रोग्रामर को भ्रमित करने के लिए इसे देखना है।

हालांकि आपके पास शायद कुछ और जटिल है, और यह केवल एक उदाहरण है। असली दुनिया में, यह और भी आसान हो जाता है:

not_a_file_die_die_die(\@files); 

फिर आप एक सबरूटीन के लिए सभी जटिल सामान ले जाते हैं। असली चाल विचार और इरादा संक्षिप्त बनाने के लिए है, जो विचार को लागू करने वाला कोड नहीं है। यांत्रिकी वास्तव में कई मामलों में कोई फर्क नहीं पड़ता; आप परिणाम के बारे में और अधिक परवाह करते हैं। उन मामलों में, यांत्रिकी पसीना मत करो।

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