У меня есть сценарий Perl, который использует XML-файл на Linux и иногда существуют CRLF (Преобразуйте в шестнадцатеричную систему 0D0A, новые строки DOS) в некоторых значениях узла, который.
Система, которая производит XML-файл, пишет все это как одну строку, и выглядит, как будто это иногда решает, что это слишком длинно и пишет CRLF в один из элементов данных. К сожалению, нет ничего, что я могу сделать об обеспечивающей системе.
Я просто должен удалить их из строки, прежде чем я обработаю ее.
Я попробовал все виды regex замены с помощью классов символа жемчуга, преобразуйте в шестнадцатеричную систему значения, все виды, и ничто, кажется, не работает.
Я даже выполнил входной файл через dos2unix прежде, чем обработать, и я все еще не могу избавиться от ошибочных символов.
У кого-либо есть какие-либо идеи?
Большое спасибо,
Обычно. После двухчасового боя я решил его в течение 5 минут после того, как задал вопрос.
$output =~ s/[\x0A\x0D]//g;
Наконец-то получил.
$output =~ tr/\x{d}\x{a}//d;
Оба символа являются пробелами, поэтому, если терминаторы всегда стоят в конце, вы можете обрезать их вправо с помощью
$output =~ s/\s+\z//;
Несколько вариантов:
1. Замените все вхождения cr / lf на lf: $ output = ~ s / \ r \ n / \ n / g; # вместо \ r \ n можно использовать \ 012 \ 015
2. Удалите все завершающие пробелы: output = ~ s / \ s + $ // g;
3. Хлюпать и раскалывать:
#!/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;
}