CR против LF разбор Perl - PullRequest
       3

CR против LF разбор Perl

5 голосов
/ 24 сентября 2011

У меня есть Perl-скрипт, который анализирует текстовый файл и разбивает его на строки в массив. Это прекрасно работает, когда каждая строка завершается LF, но когда они заканчиваются CR, мой скрипт обрабатывается неправильно. Как я могу изменить эту строку, чтобы исправить это

my @allLines = split(/^/, $entireFile);

редактировать: Мой файл имеет смесь строк с заканчивая LF или заканчивая CR, он просто сворачивает все строки, когда заканчивается в CR

Ответы [ 4 ]

11 голосов
/ 24 сентября 2011

Perl может работать как с концами строк CRLF, так и с LF со встроенным слоем :crlf PerlIO :

open(my $in, '<:crlf', $filename);

автоматически преобразует окончания строки CRLF в LF и оставляет окончания строки LF без изменений. Но файлы только для CR не нужны. Если вы знаете, что файл использует только CR, то вы можете установить $ / на "\r", и он будет читать построчно (но он не изменит CR на LF).

Если вам приходится работать с файлами с неизвестными окончаниями строк (или даже со смешанными окончаниями строк в одном файле), вы можете установить модуль PerlIO :: eol . Тогда вы можете сказать:

open(my $in, '<:raw:eol(LF)', $filename);

и он автоматически преобразует окончания строк CR, CRLF или LF в LF при чтении файла.

Другой вариант - установить $/ на undef, что будет считывать весь файл за один прием. Затем разделите его на /\r\n?|\n/. Но это предполагает, что файл достаточно мал, чтобы поместиться в памяти.

5 голосов
/ 24 сентября 2011

Если у вас смешанные окончания строк, вы можете нормализовать их, сопоставив обобщенный конец строки:

 use v5.10;

 $entireFile =~ s/\R/\n/g;

Вы также можете открыть дескриптор файла для строки и прочитать строки так же, как вы делали бы это из файла:

 open my $fh, '<', \ $entireFile;
 my @lines = <$fh>;
 close $fh;

Вы даже можете открыть строку со слоями , которые cjm показывает .

1 голос
/ 24 сентября 2011

Вы, вероятно, можете просто обрабатывать различные окончания строки при выполнении split, например:

my @allLines = split(/\r\n|\r|\n/, $entireFile);
0 голосов
/ 24 сентября 2011

Он автоматически разделит ввод на строки, если вы прочитаете с <>, но вам нужно изменить $/ на \r.

$/ - это разделитель входных записей. подробности см. perldoc perlvar.

Нет никакого способа изменить то, что регулярное выражение считает концом строки - это всегда перевод строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...