2010-07-02 13 views
6

Linux'ta bir XML dosyasını tüketen ve bazen bazı düğüm değerlerinde CRLF (Hex 0D0A, Dos yeni satırlar) bulunan bir Perl betiğim var.CRLF'yi (0D 0A) Perl'de dize kaldırma

XML dosyasını üreten sistem, hepsini tek bir satır olarak yazar ve zaman zaman bunun çok uzun olduğuna karar verir ve bir CRLF'yi veri öğelerinden birine yazar. Ne yazık ki sağlama sistemi hakkında yapabileceğim hiçbir şey yok.

Sadece bunları işlemeden önce dizeden kaldırmam gerekiyor.

Perl char sınıflarını, hex değerlerini, her türünü kullanarak her türlü regex değişimini denedim ve hiçbir şey işe yaramıyor gibi görünüyor.

İşlemi gerçekleştirmeden önce giriş dosyasını doz2unix üzerinden çalıştırıyorum ve hatalı karakterlerden hala kurtulamıyorum.

Herhangi bir fikri olan var mı?

Birçok sayesinde

cevap

13

Tipik, yaklaşık 2 saat boyunca mücadele sonra ben .. soruyu soran 5 dakika içinde çözüldü

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

Sonunda anladım.

+3

Rubberduck etkisi. Asla başarısız olmaz! :) –

+3

Bunun, '\ r' ve' \ n' karakterlerinin tüm örneklerini kaldırdığını ve '\ r \ n' dizesini değil (sadece' \ r' dizisini değil \ n \ n geçerli değerlerin olduğunu unutmayın. Diğer yerlerde ihtiyaç duyduğunuzda) –

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

Bunlar hem boşluk karakterleri, bu nedenle sonlandırıcılar sonunda her zaman, sen

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

tr /// bir düzenli ifadeden daha hızlıdır ... – dawg

+0

Parlak. Beyaz alanı ortadan kaldırmak !!! – downeyt

1

Birkaç seçenekleri ile sağ kırpabilir:/cr tüm tekrarlarını değiştirmek
1. lf ile lf: $output =~ s/\r\n/\n/g; #instead of \r\n might want to use \012\015
2. Sürücülerden tüm sondaki boşluk: output =~ s/\s+$//g;
3. Slurp ve split:

#!/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 bölünmüş –