2010-07-02 16 views
6

Tôi đã có một tập lệnh Perl tiêu thụ tệp XML trên Linux và đôi khi có CRLF (Hex 0D0A, Dos dòng mới) trong một số giá trị nút đó.Xóa CRLF (0D 0A) khỏi chuỗi trong Perl

Hệ thống tạo tệp XML ghi tất cả dưới dạng một dòng, và có vẻ như đôi khi nó quyết định quá dài và viết CRLF vào một trong các thành phần dữ liệu. Thật không may là không có gì tôi có thể làm về hệ thống cung cấp.

Tôi chỉ cần xóa chúng khỏi chuỗi trước khi xử lý.

Tôi đã thử tất cả các loại thay thế regex bằng cách sử dụng các lớp char perl, giá trị hex, tất cả các loại và không có gì có vẻ hoạt động.

Tôi thậm chí chạy tệp đầu vào thông qua dos2unix trước khi xử lý và tôi vẫn không thể loại bỏ các ký tự sai.

Có ai có ý tưởng nào không?

Nhiều Cảm ơn,

Trả lời

13

tiêu biểu, Sau khi chiến đấu trong khoảng 2 tiếng đồng hồ, tôi giải quyết nó trong vòng 5 phút đặt câu hỏi ..

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

Cuối cùng đã nhận nó.

+3

Hiệu ứng Rubberduck. Nó không bao giờ thất bại! :) –

+3

Hãy nhớ rằng điều này sẽ loại bỏ tất cả các trường hợp của các ký tự '\ r' và' \ n' và không phải chuỗi '\ r \ n' (chỉ nằm trong' \ r' hoặc '\ n' có thể là các giá trị hợp lệ mà bạn cần ở những nơi khác) –

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

Cả hai đều là nhân vật khoảng trắng, vì vậy nếu các Terminators luôn ở cuối, bạn có thể phải cắt với

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

tr /// nhanh hơn một regex ở đây ... – dawg

+0

Rực rỡ. Loại bỏ không gian màu trắng !!! – downeyt

1

Một vài lựa chọn:
1. Thay thế tất cả các lần xuất hiện của cr/lf với lf: $output =~ s/\r\n/\n/g; #instead of \r\n might want to use \012\015
2. Hủy bỏ tất cả khoảng trắng trailing: output =~ s/\s+$//g;
3. Slurp và chia:

#!/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 chia –