2009-05-19 8 views
5

पर्ल का उपयोग कर फ़ाइल में विस्तारित ASCII वर्ण कैसे प्राप्त कर सकते हैं? क्या कोई स्क्रिप्ट प्राप्त कर सकता है? पहले सेपर्ल का उपयोग कर फ़ाइल में विस्तारित ASCII वर्ण कैसे प्राप्त कर सकते हैं?

..... धन्यवाद .....

उत्तर

10

विस्तारित ASCII वर्ण के बाद से मूल्य 128 and higher है, तो आप सिर्फ अलग-अलग पात्रों पर ord फोन और निम्नलिखित एक मूल्य के> = 128 के साथ उन लोगों संभाल कर सकते हैं कोड stdin और प्रिंट केवल विस्तारित ASCII वर्ण से पढ़ता है:

while (<>) { 
    while (/(.)/g) { 
    print($1) if (ord($1) >= 128); 
    } 
} 

वैकल्पिक रूप से, chr साथ unpack एक साथ भी काम करेंगे। उदाहरण:

while (<>) { 
    foreach (unpack("C*", $_)) { 
    print(chr($_)) if ($_ >= 128); 
    } 
} 

(मुझे यकीन है कि कुछ पर्ल गुरु इन दोनों को दो एक-लाइनर्स को गाढ़ा कर सकते हैं ...)


बजाय लाइन संख्या मुद्रित करने के लिए, आप निम्न का उपयोग कर सकते (इस डुप्लिकेट निकालने नहीं करता है और अजीब व्यवहार होगा जब यूनिकोड पारित हो जाता है): (। $. टिप के लिए धन्यवाद Yaakov Belch)

while (<>) { 
    while (/(.)/g) { 
    print($. . "\n") if (ord($1) >= 128); 
    } 
} 

+0

यह बहुत धीमी गति से और अप्रभावी दृष्टिकोण है, डेव Sherohman के समाधान http://stackoverflow.com/questions/881931/how-to-print-numbers-of-line-containing-extended-ascii-characters देखना -इन-पर्ल/882113 # 882113 यह बहुत तेज और सरल है। –

+0

यह उत्तर डेव के पहले पोस्ट किया गया था। मैंने डेव के दृष्टिकोण को देखा है, और इसे ज्यादातर मामलों में प्राथमिकता दी जानी चाहिए। यह सिर्फ दिखाता है कि मैं एक पर्ल नौसिखिया हूँ। मैं इस जवाब को मिटाना नहीं चुनता क्योंकि आखिरी हिस्सा ऐसा लगता है कि प्रश्नकर्ता क्या चाहता है। यह भी देखें http://stackoverflow.com/questions/882122/reading-a-file-char-by-char-and-checking-for-extent-ascii-char – Stephan202

+0

... आह, वह पृष्ठ हटा दिया गया है। यह कहने के लिए पर्याप्त है, प्रश्न में कहा गया है कि लाइन * प्रत्येक * विस्तारित ASCII चरित्र के लिए मुद्रित किया जाना चाहिए। यही मेरा समाधान करता है। – Stephan202

7

पहला प्रिंट करने योग्य ASCII वर्ण space (32) है। अंतिम प्रिंट करने योग्य ASCII वर्ण ~ (126) है। तो मैं शायद

while (<>) { 
    print "$.\n" if /[^ -~]/; 
} 

का उपयोग हालांकि यह, बेशक, यह भी नियंत्रण वर्ण के साथ-साथ एक्स्टेंडेड ASCII युक्त लाइनों को प्रदर्शित करेगा चाहते हैं।

संपादित करें: लाइन के बजाए लाइन नंबर मुद्रित करने के लिए बदला गया।

+1

लाइन के बजाय लाइन नंबर मुद्रित करना आसान है: जबकि (<>) {print "$। \ N" if/[^ - ~] /;} यह बताई गई समस्या को हल करना चाहिए –

+0

ओह! मैं सिर्फ सवाल ही पढ़ रहा था और याद किया कि शीर्षक निर्दिष्ट है कि वह लाइन नंबर चाहता था। पकड़ के लिए धन्यवाद। –

5

Oneliner:

perl -nE'say$.if/[\xE0-\xFF]/' 
पुराने पर्ल संस्करणों

के लिए

perl -lne'print$.if/[\xE0-\xFF]/' 
2

एक महत्वपूर्ण सवाल है कि क्या

उपयोग बाइट्स;

प्रगा प्रभाव में होना चाहिए। पोस्टर को यह तय करना चाहिए। 127 से अधिक कोड के साथ पात्रों उठा लिए, निम्न पर्याप्त होगा:

print grep 127 < ord, split // while <>; 

या

print grep /[^[:ascii:]]/, split // while <>; 
1

हाइनेक -Pichi- Vychodil का जवाब:

perl -nE'say$.if/[\xE0-\xFF]/' 

केवल एक सीमित भाग का परीक्षण करती है गैर-प्रिंटिंग का संभवतः

होना चाहिए

इसके बजाए।

1

grep के बारे में क्या?

grep [\x00-\x1F\x7F-\xFF]+ * 
संबंधित मुद्दे

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