2016-11-16 5 views
10

मैं अपने घटक वर्णों में split एक स्ट्रिंग का प्रयास कर रहा हूं।
इस प्रयोजन के लिए मैं हमेशा split(//, $str) का उपयोग किया है के रूप में the documentation ने सुझाव दिया:

हालांकि, इस:
print join(':', split(//, 'abc')), "\n";
रिक्त स्ट्रिंग विभाजक उत्पादन का उत्पादन करने के लिए के रूप में मेल खाता है का उपयोग करता है a:b:c; इस प्रकार, खाली स्ट्रिंग का उपयोग एक्सपीआर को इसके घटक वर्णों की सूची में विभाजित करने के लिए किया जा सकता है।

मेरी स्क्रिप्ट में मैं पहली बार एन पात्रों या पहले length($str) - 1 वर्ण, जो भी कम हो की एक सरणी की जरूरत है। इसे प्राप्त करने के लिए, मैं split(//, $str, $n + 1) का उपयोग करता हूं और अंतिम तत्व को त्याग देता हूं।

सिद्धांत में यह काम करना चाहिए। यदि LIMIT स्ट्रिंग लम्बाई से कम है तो सभी अतिरिक्त वर्णों को अंतिम तत्व में समूहित किया जाता है जिसे छोड़ दिया जाता है। यदि LIMIT स्ट्रिंग लंबाई से अधिक है, तो अंतिम तत्व अंतिम वर्ण है जिसे त्याग दिया जाता है।

यह वह जगह है जहां मैं किसी समस्या का सामना करता हूं।

प्रलेखन कहते हैं:

... और इनमें से प्रत्येक:
print join(':', split(//, 'abc', 3)), "\n";
print join(':', split(//, 'abc', 4)), "\n";
उत्पादन a:b:c पैदा करता है।

लेकिन यह परिणाम मुझे नहीं मिल रहा है।

print join(':', split(//, 'abc', 1)), "\n"; # abc 
print join(':', split(//, 'abc', 2)), "\n"; # a:bc 
print join(':', split(//, 'abc', 3)), "\n"; # a:b:c 
print join(':', split(//, 'abc', 4)), "\n"; # a:b:c: 
print join(':', split(//, 'abc', 99)), "\n"; # a:b:c: 

इन परिणामों सीधे दस्तावेज़ से उदाहरण खंडन: अगर LIMIT वर्णों की संख्या से अधिक है, जिसके परिणामस्वरूप सरणी हमेशा बिल्कुल एक खाली तत्व (demo) के साथ समाप्त होता है।

क्या प्रलेखन गलत है? क्या मेरा संस्करण पर्ल (v5.22.2) गलत है?
यदि इस व्यवहार से बचा नहीं जा सकता है, तो मैं अपना मूल लक्ष्य कैसे पूरा कर सकता हूं?

+0

आप अंत में अपना खाली पैटर्न '/ (?! $) /' में बदल सकते हैं। –

+1

ठीक है, एक वैकल्पिक तरीका 'विभाजन (//, substr ($ string, 0, $ n) हो सकता है) ' – infixed

+2

मुझे लगता है कि दस्तावेज़ सिर्फ सादा गलत है। यदि सीमा लंबाई से अधिक है, तो अंत में शून्य चौड़ाई मैच के बाद खाली स्ट्रिंग शामिल की जानी चाहिए। – ysth

उत्तर

7

ऐसा प्रतीत होता है कि प्रलेखन में उदाहरण गलत है।

एक खाली अनुगामी क्षेत्र, दूसरे हाथ पर, जब वहाँ मैच की लंबाई के EXPR के अंत में एक मैच है, परवाह किए बिना उत्पादन किया जाता है: एक छोटी सी आगे प्रलेखन नीचे पीछा कर रहा है (बेशक, जब तक एक गैर-शून्य LIMIT स्पष्ट रूप से नहीं दिया जाता है, ऐसे फ़ील्ड हटा दिए जाते हैं, जैसा कि अंतिम उदाहरण में)।

क्योंकि मैं एक गैर-शून्य LIMIT प्रदान कर रहा हूं, खाली फ़ील्ड पीछे रखे हुए हैं। खाली पैटर्न // अंतिम चरित्र के बाद मैच लेकिन स्ट्रिंग के अंत से पहले, तो वास्तव में एक खाली खाली क्षेत्र का उत्पादन होता है।

समाधान टिप्पणियां – में प्रस्तावित (?!$) के एक विभाजन पद्धति का उपयोग कर या एक इनपुट – दोनों काम के रूप में substr($str, 0, $n) का उपयोग कर।
हालांकि, सहयोग करने के लिए split को मजबूर करने के बजाय, मैंने pop(@arr) से while (@arr && pop(@arr) eq "") { } से "अंतिम तत्व को छोड़ दें" तर्क को अपडेट करने का विकल्प चुना है।

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