2008-12-16 11 views
31

मैं पर्ल में एक स्ट्रिंग कैसे ले सकता हूं और इसे एक सरणी में विभाजित कर सकता हूं जिसमें प्रत्येक अक्षर दो अक्षर लंबे होते हैं?मैं एक स्ट्रिंग को पर्ल में प्रत्येक दो अक्षरों के टुकड़ों में कैसे विभाजित कर सकता हूं?

मैं इस प्रयास किया:

@array = split(/../, $string); 

लेकिन अपेक्षित परिणाम नहीं मिला।

अंत में मैं एक सरणी युक्त करने के लिए इस

F53CBBA476 

की तरह कुछ करना चाहते हैं

F5 3C BB A4 76 

उत्तर

52
@array = ($string =~ m/../g); 

पैटर्न मिलान ऑपरेटर पर्ल में एक सूची के संदर्भ में एक विशेष तरीके से व्यवहार करती है । यह पिछले मैच के बाद पाठ के बाकी हिस्सों के खिलाफ पैटर्न से मिलान करने के लिए ऑपरेशन को क्रमशः संसाधित करता है। फिर सूची सभी पाठों से बनाई गई है जो पैटर्न-मिलान के प्रत्येक एप्लिकेशन के दौरान मेल खाते हैं।

37

तुम सच में split का उपयोग करना चाहिए, तो आप एक कर सकते हैं:

grep {length > 0} split(/(..)/, $string); 

लेकिन मुझे लगता है सबसे तेज़ तरीका unpack साथ होगा:

unpack("(A2)*", $string); 

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

+0

चूंकि ऐसा लगता है कि वह हेक्स वर्णों के साथ काम कर रहा है, इसलिए यह एक महत्वपूर्ण बिंदु है, लेकिन एएससीआईआई अक्षरों के लिए एकमात्र काम करता है। विभाजन किसी भी एन्कोडिंग के लिए काम करना चाहिए, लेकिन हो सकता है कि आप regex में ए/एस जोड़ना चाहें ताकि "\ n" मिलान किया जा सके "। –

+2

'ए 2' होना चाहिए, न कि 'ए 2'। व्हाइट स्ट्रैस का पीछा करने वाली पूर्व स्ट्रिप्स, जो कि सबसे अच्छी तरह से उपलब्ध है। – ikegami

6

वास्तव में, अजीब चरित्र को पकड़ने के लिए है, तो आप दूसरे चरित्र वैकल्पिक बनाना चाहते:

@array = ($string =~ m/..?/g); 
+1

yup, लेकिन यह अनपॅक से धीमा तरीका है। – mat

5

पैटर्न split के लिए पारित पहचान करता है जिन्हें अलग कि जो आप चाहते हैं। आप विभाजन का उपयोग करना चाहता है, तो आप की तरह

my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string; 

या

my @pairs = split /(?=(?:.{2})+\z)/s, $string; 

कुछ का उपयोग करेंगे उन बल्कि गरीब समाधान कर रहे हैं। बेहतर समाधानों में शामिल हैं:

my @pairs = $string =~ /..?/sg; # Accepts odd-length strings. 

my @pairs = $string =~ /../sg; 

my @pairs = unpack '(a2)*', $string; 
संबंधित मुद्दे

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