2010-07-02 11 views
6

में स्ट्रिंग से सीआरएलएफ (0 डी 0 ए) को हटाकर मुझे एक पर्ल स्क्रिप्ट मिली है जो लिनक्स पर एक एक्सएमएल फाइल का उपभोग करती है और कभी-कभी कुछ नोड मानों में सीआरएलएफ (हेक्स 0 डी 0 ए, डॉस नई लाइनें) होती है।पर्ल

सिस्टम जो एक्सएमएल फ़ाइल बनाता है, यह सब एक ही पंक्ति के रूप में लिखता है, और ऐसा लगता है कि यह कभी-कभी निर्णय लेता है कि यह बहुत लंबा है और डेटा तत्वों में से एक में सीआरएलएफ लिखता है। दुर्भाग्यवश कुछ भी नहीं है जो मैं प्रदान करने वाले सिस्टम के बारे में कर सकता हूं।

मुझे इसे संसाधित करने से पहले स्ट्रिंग से इन्हें हटाने की आवश्यकता है।

मैंने पर्ले चार वर्गों, हेक्स मानों, सभी प्रकारों का उपयोग करके सभी प्रकार के रेगेक्स प्रतिस्थापन की कोशिश की है और कुछ भी काम नहीं करता है।

मैंने प्रसंस्करण से पहले डॉस 2unix के माध्यम से इनपुट फ़ाइल भी चलाई है और मैं अभी भी गलत वर्णों से छुटकारा नहीं पा सकता हूं।

क्या किसी के पास कोई विचार है?

कई धन्यवाद,

उत्तर

13

ठेठ, के बारे में 2 घंटे के लिए जूझ के बाद, मैं यह सवाल पूछने के 5 मिनट के भीतर हल ..

$output =~ s/[\x0A\x0D]//g; 

अंत में यह मिल गया।

+3

रबरडक प्रभाव। यह कभी विफल नहीं होता! :) –

+3

ध्यान रखें कि यह अक्षर \ r' और '\ n' के सभी उदाहरणों को हटा रहा है और स्ट्रिंग' \ r \ n' नहीं है (केवल '\ r' या '\ n' वैध मान हो सकता है कि आपको अन्य स्थानों में आवश्यकता है) –

6
$output =~ tr/\x{d}\x{a}//d; 

इन दोनों खाली स्थान के चरित्र, इसलिए टर्मिनेटर्स अंत में हमेशा से रहे हैं, तो आप

$output =~ s/\s+\z//; 
+0

tr /// यहां एक रेगेक्स से तेज है ... – dawg

+0

शानदार। सफेद जगह को खत्म करना !!! – downeyt

1

कुछ विकल्पों के साथ सही-ट्रिम कर सकते हैं:
1. करोड़ की सभी घटनाओं की जगह/वामो के साथ वामो: $output =~ s/\r\n/\n/g; #instead of \r\n might want to use \012\015
2. हटाएँ सभी पिछली श्वेत रिक्ति: output =~ s/\s+$//g;
3. Slurp और विभाजन:

#!/usr/bin/perl -w 

use strict; 
use LWP::Simple; 

    sub main{ 
     createfile(); 
     outputfile(); 
    } 

    main(); 

    sub createfile{ 
     (my $file = $0)=~ s/\.pl/\.txt/; 

     open my $fh, ">", $file; 
     print $fh "1\n2\r\n3\n4\r\n5"; 
     close $fh; 
    } 

    sub outputfile{ 
     (my $filei = $0)=~ s/\.pl/\.txt/; 
     (my $fileo = $0)=~ s/\.pl/out\.txt/; 

     open my $fin, "<", $filei; 
     local $/;        # slurp the file 
     my $text = <$fin>;      # store the text 
     my @text = split(/(?:\r\n|\n)/, $text); # split on dos or unix newlines 
     close $fin; 

     local $" = ", ";       # change array scalar separator 
     open my $fout, ">", $fileo; 
     print $fout "@text";      # should output numbers separated by comma space 
     close $fout; 
    } 
+0

+1 slurp, +1 विभाजन –