2010-04-20 12 views
6

एक आम 'Perlism' इस रूप में पाश के लिए कुछ के रूप में एक सूची से अधिक पैदा कर रहा है:क्या मैं पर्ल में वर्णों में स्ट्रिंग को विभाजित करने के लिए अनपैक का उपयोग कर सकता हूं?

for($str=~/./g) { print "the next character from \"$str\"=$_\n"; }

इस मामले में वैश्विक मैच regex एक सूची है कि स्ट्रिंग $str से बदले में एक चरित्र है देता है, और $_

एक regex के बजाय

, split एक ही तरीके से इस्तेमाल किया जा सकता या 'a'..'z', map है कि मूल्य, आदि

मैं में हूँ प्रदान करती है एक स्ट्रिंग के क्षेत्र की व्याख्या द्वारा क्षेत्र उत्पन्न करने के लिए unpack को निहित करना। मुझे हमेशा unpack मिला है जो मेरे दिमाग के काम के तरीके से कम सरल है, और मैंने कभी भी उसमें गहराई से खोला नहीं है।

एक सरल मामले के रूप में, मैं एक सूची है कि एक स्ट्रिंग से प्रत्येक तत्व में एक चरित्र खोल उपयोग कर रहा है उत्पन्न करना चाहते हैं (हाँ - मैं जानता हूँ कि मैं split(//,$str) और /./g साथ यह कर सकते हैं, लेकिन मैं वास्तव में अगर खोलना कर सकते हैं देखना चाहते हैं इस तरह इस्तेमाल किया जा सकता है ...)

जाहिर है, मैं unpack("A1" x length($str), $str) अनपॅक के लिए फ़ील्ड सूची का उपयोग कर सकता हूं लेकिन क्या ऐसा कोई अन्य तरीका है जो ग्लोबिंग की तरह दिखता है? यानी, क्या मैं सूची संदर्भ में या लूप में unpack(some_format,$str) पर कॉल कर सकता हूं जैसे कि अनपैक प्रारूप समूह में चरित्र के अगले समूह को वापस लौटाएगा जब तक कि $ str समाप्त नहीं हो जाता?

मैं The Perl 5.12 Pack pod पढ़ लिया है और Perl 5.12 pack tutorial और the Perkmonks tutorial

यहाँ नमूना कोड है:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $str=join('',('a'..'z', 'A'..'Z')); #the alphabet... 

$str=~s/(.{1,3})/$1 /g;    #...in groups of three 
print "str=$str\n\n"; 

for ($str=~/./g) { 
print "regex: = $_\n"; 
} 

for(split(//,$str)) { 
print "split: \$_=$_\n"; 
} 

for(unpack("A1" x length($str), $str)) { 
print "unpack: \$_=$_\n"; 
} 

उत्तर

9

pack और unpack टेम्पलेट्स ज्यादा regexps कर सकते हैं की तरह समूह बातें करने के लिए कोष्ठक का उपयोग कर सकते हैं। समूह को दोहराने की गणना के बाद किया जा सकता है। दोहराव गणना के रूप में * का अर्थ है "जब तक आप पैक/अनपैक करने के लिए चीजों से बाहर नहीं निकलते हैं तब तक दोहराएं"।

for(unpack("(A1)*", $str)) { 
    print "unpack: \$_=$_\n"; 
} 

आपको यह पता लगाने के लिए एक बेंचमार्क चलाने होंगे कि इनमें से कौन सा सबसे तेज़ है।

+0

मुझे पता था कि यह सरल होना था !!! अब जब मैं इसके साथ खेलता हूं, '' (ए 1) * "' ग्लोब (मेरा प्रश्न) और '" (ए 1) $ i "' i फ़ील्ड उत्पन्न करेगा। पीची! क्या आप जानते हैं कि इसे एक अच्छे तरीके से दस्तावेज किया गया है? वेब पर अधिकांश सामग्री बहुत अच्छी नहीं थी ... – dawg

+0

@drewk: 'perldoc -f pack' (http://perldoc.perl.org/functions/pack.html) में "दोहराना गिनती के लिए * आपूर्ति करना" पर एक संख्या के बजाय उपयोग करने का मतलब है हालांकि कई आइटम छोड़े गए हैं ... "और" ए() -ग्रुप एक उप-टेम्पलेट कोष्ठक में संलग्न है ... " – Ether

+0

@ अन्य: पेल्डडोक में उदाहरण मुझसे इस बात से बात नहीं करते थे मामला। '*' के अधिकांश उपयोग 'अनपैक' ए 3/ए ए * ',' 007 बॉन्ड जे 'के रूप में' बाकी को घुमाए 'के रूप में थे; देता है ('बॉन्ड', 'जे') 'और मुझे लगता है कि पैक/अनपैक पर पेल्डडॉक हो सकता है - अधिक स्पष्ट ... – dawg

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

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