2012-09-01 8 views
6

मैं एक पर्ल एक लाइनर देखा 8 वर्ण के कुछ यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए:मुझे निम्नलिखित लाइनर एक लाइनर में ब्रेसिज़ की आवश्यकता क्यों है?

perl -le 'print map { ("a".."z")[rand 26] } 1..5'

लेकिन इस नक्शे के लिए {} बिना काम नहीं करता। ऐसा क्यों है?

+0

कोड जो वास्तव में काम नहीं करता था? यह '{}' के बिना किया जा सकता है। – aschepler

+1

@aschepler: हाँ, लेकिन यदि आपने ब्रेसिज़ को हटा दिया है, तो आपको ब्लॉक और सूची के बीच एक अल्पविराम जोड़ने की आवश्यकता है। –

उत्तर

11

perldoc -f map देखें। map में दो रूप हैं: map({block} @array) और map(expression, @array)। बाद वाले मिलकर इसलिए की तरह इस्तेमाल किया जा सकता है:

perl -le 'print map(("a".."z")[rand 26], 1..5)' 
perl -le 'print map +("a".."z")[rand 26], 1..5' 

कारण

perl -le 'print map ("a".."z")[rand 26], 1..5' 

काम नहीं करता है, क्योंकि यह की तरह

perl -le 'print(((map("a".."z"))[rand(26)]), 1..5)' 

दूसरे शब्दों में पार्स करते "a".."z" बन map का एकमात्र तर्क, जो मान्य नहीं है। इसे कोष्ठक के एक अतिरिक्त सेट या एक unary + के साथ असंबद्ध किया जा सकता है।

+0

धन्यवाद! समझ में आता है। –

+0

यूनरी + वहां कैसे मदद मिली? मैंने इसे प्रदान किए गए दस्तावेज़ लिंक में एक उदाहरण में उल्लेख किया है लेकिन यह सुनिश्चित नहीं है कि यह कैसे काम करता है। क्या फ़ंक्शन कॉल में ब्रांडेसिस से बचने के लिए यह एक आम बात है जिसे मैं Google कर सकता हूं? –

+1

@PalaceChan इसका उपयोग 'मानचित्र' को पहले से अलग करने के लिए किया जाता है '('यह चाल सामान्य पर्ल उपयोग फ़ंक्शंस है जो कई तर्क लेती है - अन्य में' grep' और' print' शामिल हैं। – ephemient

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