2009-11-02 12 views
11

पर्ल एक स्ट्रिंग को इंडेक्स करने के लिए सामान्य [] ऑपरेटर का समर्थन क्यों नहीं करता है?पर्ल एक स्ट्रिंग को इंडेक्स करने के लिए सामान्य [] ऑपरेटर का समर्थन क्यों नहीं करता है?

लगभग सभी प्रमुख प्रोग्रामिंग भाषाएं इस ऑपरेटर का समर्थन करती हैं, खासकर अन्य दो 'पी': पायथन और PHP। इसके अलावा, मुझे लगता है कि इस छोटे वाक्यविन्यास को लागू करना आसान होना चाहिए। साथ ही, पर्ल प्रोग्रामिंग भाषा के दर्शन के रूप में - जैसा कि हम कर सकते हैं आलसी के रूप में, तो हम स्ट्रिंग को इंडेक्स करने के लिए फ़ंक्शन का उपयोग करने के लिए परेशान क्यों हैं?

क्या पर्ल 6 इस वाक्यविन्यास का समर्थन करेगा?

+2

यह एक सुविधा नहीं है। यह सिर्फ वाक्यविन्यास है। – postfuturist

+4

'[]' के बारे में कुछ भी 'सामान्य' नहीं है। इतना ही नहीं, लेकिन सिंटैक्स के बावजूद '[] 'एक समारोह के रूप में लागू किया जा सकता है या नहीं भी हो सकता है (उदाहरण के लिए, रूबी' [] 'वास्तव में एक विधि है)। – rfunduk

+3

साइड नोट: किसी भी फीचर या सिंटैक्स को साझा करने के लिए पर्ल, पायथन और PHP के लिए कोई आवश्यकता नहीं है। उन तीन भाषाओं में बहुत अलग वाक्यविन्यास, बहुत अलग अर्थशास्त्र, और बहुत अलग डिजाइन लक्ष्यों हैं।यदि आप उन्हें एक जैसा होने की उम्मीद करते हैं, तो आप एक बड़ी निराशा के लिए हैं। (उदाहरण के लिए, हास्केल में, किसी स्ट्रिंग से एनएचएच चरित्र निकालने के लिए ऑपरेटर, या किसी भी सूची से एनएच आइटम, '$$' है। कोई भी शिकायत नहीं करता है कि हास्केल उस उद्देश्य के लिए' [] 'का उपयोग नहीं करता है .. ।) –

उत्तर

45

मुझे अब तक सभी उत्तरों पसंद हैं, लेकिन असली जवाब यह है, "क्योंकि लैरी इसे इस तरह से चाहता है"। वास्तव में। लैरी मुहावरे और औजारों के एक सेट के साथ आया जो उनके लिए काम करता था, और उन्होंने हमारे साथ पर्ल के रूप में साझा किया। यदि आपको लगता है कि लैरी सोचने का तरीका नहीं है, तो उपयोग करने के लिए कई अन्य टूल हैं। हमें पर्ल का उपयोग करके पूरी दुनिया की आवश्यकता नहीं है ... केवल वे लोग जो लैरी के तरीके से "इसे प्राप्त करते हैं"।

+0

हां, लेकिन लैरी के तर्क क्या था? शायद आपके पास कुछ अंतर्दृष्टि है? –

18

क्या आप बाइट्स, वर्णों या ग्रैफेम्स द्वारा इंडेक्स करना चाहते हैं? एक समय

  • chars
    पर

    • bytes
      ठीक एक बाइट स्रोत पाठ के आधार पर यह एक हो सकता है:

      यही कारण है कि पर्ल 6 length is "banned" में, इसके बजाय आप निम्न में से एक का उपयोग करें एकल बाइट, या कई बाइट्स।

    • graphs
      यह वर्णों के समान है, लेकिन कई "संयोजन" वर्णों को एक साथ जोड़ता है।

    तुम सच में आप कुछ इसी तरह कर सकते हैं, split का उपयोग कर सकते हैं।

    (split '', $str)[$index]; 
    

    यह शायद हालांकि अभी substr उपयोग करने के लिए बेहतर है।

    substr $str, $index, 1; 
    
  • +0

    मैंने लिखा था '(विभाजित //, $ str) [$ index] 'क्योंकि यह एक अनावश्यक अनाम सूची बनाने से बचाता है, लेकिन दोनों थोड़े अजीब दिखते हैं, है ना? 'substr ($ str, $ अनुक्रमणिका, 1)' (या '$ str.substr ($ अनुक्रमणिका, 1)', पर्ल 6 में) शायद सबसे अच्छा, पठनीयता-वार है। – ephemient

    +1

    "विभाजन विभाजित" द्वारा भ्रमित लोगों के लिए, विभाजित // - नोटेशन (उदाहरण के लिए 'विभाजन/foo/') या किसी अभिव्यक्ति में नियमित अभिव्यक्ति ले सकता है जिसे नियमित अभिव्यक्ति (जैसे' विभाजन" के रूप में व्याख्या किया जाना चाहिए)। 'ओ' के ')। अपरिफ को एक खाली स्ट्रिंग में प्रचारित किया जाता है और एक नियमित अभिव्यक्ति के रूप में संकलित किया जाता है, जो "विभाजित // 'के समान परिणाम उत्पन्न करता है," अनियमित मूल्य का उपयोग "चेतावनी के अलावा। (दूसरा अंतर यह है कि प्रत्येक बार स्प्लिट को केवल एक बार के बजाय निष्पादित करने के लिए नियमित अभिव्यक्ति को संकलित करने का प्रयास किया जाता है।) – ysth

    +0

    मैंने 'विभाजन' का उपयोग किया, ... 'यहां विभाजित //, ... कोड हाइलाइटर के साथ समस्याओं की वजह से। –

    7

    पर्ल में, स्ट्रिंग स्केलर हैं और इस प्रकार डिफ़ॉल्ट रूप से सबस्क्रिप्ट योग्य नहीं हैं। स्ट्रिंग में विशिष्ट वर्णों तक पहुंचने के लिए आप substr() या index() जैसे फ़ंक्शंस का उपयोग कर सकते हैं।

    जब तक पर्ल 6 इस अवधारणा के साथ तारों की एक सरणी में तारों को बदलकर टूटता है तो मुझे नहीं लगता कि इसमें कोई बदलाव आएगा।

    +0

    ठीक है, पर्ल 6 में, स्केलर ऑब्जेक्ट्स हैं, इसलिए एक विधि बहुत अच्छी तरह से हो सकती है जो एक ही काम करता है। –

    +0

    जब तक वे सभी मौजूदा सामान नहीं तोड़ते हैं, तब तक मैं परिवर्तन के लिए खुला हूं;) – Shirkrin

    +0

    यह संभवतः 'ऑटोबॉक्स' का उपयोग करके कुछ जादू के साथ किया जा सकता है और '[] 'ऑपरेटर को ओवरराइड कर सकता है। – Ether

    12

    पर्ल index या substr के साथ स्ट्रिंग को इंडेक्स करने का एक तरीका है। यह ऑपरेशन का समर्थन करता है। यह किसी अन्य वाक्यविन्यास के साथ यह कोई फर्क नहीं पड़ता है। एक कारण है कि हमारे पास एक से अधिक प्रोग्रामिंग भाषा है। :)

    मैं यह नहीं कहूंगा कि [] एक "सामान्य" ऑपरेटर है। मुझे यकीन है कि लोग कई भाषाओं को सूचीबद्ध कर सकते हैं जो ऐसा नहीं करते हैं।

    +0

    यह "एक और वाक्यविन्यास" का वर्णन करने वाली एक पंक्ति जोड़ने में मदद करेगा –

    +0

    ब्रायन के उत्तर के विवरण के बारे में शिकायत करने वाले किसी के बारे में कुछ बुराई है :) मैं नीचे टिप्पणी में सुझाए गए वाक्यविन्यास को शामिल करने के लिए ब्रायन के उत्तर को संपादित करूंगा। – DVK

    +0

    ... बीटीडब्लू, कारण यह विडंबना है ब्रायन दूसरों के पर्ल क्यूएस और एएस के सबसे प्रभावशाली संपादक हैं, अक्सर स्पष्टीकरण विवरण जोड़ते हैं। – DVK

    23

    स्ट्रिंग में इंडेक्स करने के लिए [] का उपयोग करना कई प्रोग्रामिंग भाषा तारों का इलाज करने के तरीके का एक दुष्प्रभाव है: वर्णों के सरणी (या यूनिकोड के मामले में विस्तृत वर्ण) के सरणी के रूप में। पर्ल में, तार प्रथम श्रेणी की इकाइयां हैं। पर्ल एक ही मूल्य के रूप में पूरे तारों के साथ काम करने के तरीकों का एक धन प्रदान करता है। यदि आप एक स्ट्रिंग में अनुक्रमित करने का प्रयास कर रहे हैं तो आप शायद कुछ गलत कर रहे हैं। (उदाहरण के लिए पर्ल मुहावरे का उपयोग करने के बजाय पर्ल में सी लिखना।) उन मामलों के लिए जहां आपको वास्तव में स्ट्रिंग में अनुक्रमणित करने की आवश्यकता है, substr का उपयोग करें।

    +5

    कि एक स्ट्रिंग एक प्रथम श्रेणी की इकाई है (वर्णों की एक साधारण सरणी के विपरीत) इसका मतलब यह नहीं है कि इसे सरणी के रूप में सिंटेक्टिक रूप से इलाज नहीं किया जा सकता है। उदाहरण के लिए जावा, सी #, और डेल्फी देखें। –

    9

    यदि आप वास्तव में वस्तुओं के रूप में स्केलर्स का इलाज करना चाहते हैं, तो आप autobox का उपयोग कर सकते हैं।

    मैं autobox का उपयोग नहीं है, लेकिन यह काम करना चाहिए:

    my $indexed = ('foo'->list)[1]; 
    

    autobox विभिन्न डेटा प्रकार लपेटकर के लिए उपयोग करने के लिए वस्तुओं परिभाषित करने के लिए हुक है।

    इसलिए, यदि आप सच में, सच यह चाहते हैं, आपको लगता है कि इस तरह से कोड की अनुमति देगा autobox उपयोग करने के लिए अपनी खुद की स्ट्रिंग वर्ग बनाने के लिए सक्षम होना चाहिए:

    my $indexed = 'foo'->[3]; 
    

    तो, मैं आपके सवाल का जवाब लगता है , "पर्ल के स्ट्रिंग इंडेक्सिंग के लिए [] वाक्यविन्यास क्यों नहीं है?" "कोई भी इसे लागू करने के लिए पर्याप्त नहीं चाहता था।"

    पर्ल 6 के रूप में, मैंने जवाब देने के लिए पर्याप्त बारीकी से पालन नहीं किया है, "यदि यह मौजूद नहीं है और आप वास्तव में इसे चाहते हैं, तो आप इसे स्वयं जोड़ सकेंगे।"

    +2

    यह पर्ल 6 में मौजूद नहीं है, लेकिन मुझे लगता है कि आपको बस 'बहु विधि पोस्टक्रिकमफ्लेक्स: <[ ]> (स्ट्र, इंट)' को परिभाषित करने में सक्षम होना चाहिए (हालांकि मैं जांच नहीं कर सकता क्योंकि चूकुडो अभी तक इसका समर्थन नहीं करता है)। – ephemient

    7

    स्ट्रिंग का नाम क्या है? यह स्केलर है, इसलिए सिगिल स्पष्ट रूप से $ होगा। बाकी के मानक परिवर्तनीय नामकरण मानकों का पालन करता है; मान लें $abc

    my $abc = 'A string'; 
    

    sigils दर्शाता अभिव्यक्ति की संदर्भ है, और नाम का हिस्सा नहीं हैं, हम एक टकराव की है।

    my $def = $abc[2]; 
    

    अदिश $abc 3 पत्र है, लेकिन एक सरणी से तीसरा तत्व नहीं है - एक ही प्रतीक साझा करने (लेकिन एक अलग sigil के साथ): @abc

    तो अभिव्यक्ति, जिसे संभवतः स्क्रिप्ट-जैसे प्रतीक संकल्प के लिए डिज़ाइन किया गया था, पहले से ही इसका अर्थ है।

    बेशक, ब्रैड के उत्तर बिंदुओं के मुताबिक, अगर हम "सूची" में "आइटम" स्ट्रिंग का एक हिस्सा बनाने के लिए अंतर्निहित धारणाएं करते हैं, तो इसका अर्थ केवल एक अर्थ हो सकता है। आपके द्वारा उपयोग किए जाने वाले अधिक एन्कोडिंग, खराब उन डिफ़ॉल्ट मान्यताओं का काम करते हैं।

    आप अधिक autobox का उपयोग कर एक वाक्य रचना आप पसंद करते हैं खोज सकते हैं:

    $string->ch(2); 
    

    (आप ch खुद के बारे में होगा।) लेकिन इसका आवश्यक बस तार पर ब्रैकेट के डालने से भी अधिक वर्बोज़ है।

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