Почему я получаю перерывы линейки на веб-странице, я загружаю с Perl?
-
30-09-2019 - |
Вопрос
Я пишу простой сценарий Perl (в Windows), чтобы загрузить ответ запроса получения URL в файл. Довольно прямо вперед. За исключением случаев, когда он пишет в выходной файл, я получаю перерывы линейки. Так нравится вместо:
<head>
<title>title</title>
<link .../>
</head>
я получил
<head>
<title>title</title>
<link .../>
</head>
Вот сценарий Perl:
use LWP::Simple;
my $url = $ARGV[0];
my $content = get($url);
open(outputFile, '+>', $ARGV[1]);
print outputFile $content;
close(outputFile);
Я полагаю, я мог бы просто получить wget для окон, но теперь это беспокоит меня. Как мне избавиться от этих линейных перерывов?!
Решение
- Там нет вменяемой причины для
>+
Режим в вашем примере кода. Просто говорю. LWP::Simple
имеетgetstore
метод. Если вы используетеLWP::Simple
, Почему бы не использовать это?- По умолчанию открыть открыть
:crlf
Слой ввода / вывода при работе на Win32, который поворачивается\n
в\r\n
. Отказ Но данные, которые вы пишете уже имеют\r\n
, Так что вы заканчиваете слишком много новых линий. Если вы хотите, чтобы данные были написаны Verbatim, вы должны использоватьbinmode
, или открыть ручку с:raw
начать с. LWP уже делает это правильно.
Другие советы
Я предполагаю это $content
Уже включает в себя CRLF Newlines и слой IO Perl выполняет преобразование LF -> CRLF. (Внутренне, « N» - это один символ в Perl, обычно LF). Я бы добавил
binmode(outputFile);
после open
отключить это преобразование и запись результатов $content
напрямую.
Comp ($ Content) будет мое предположение. Как выглядит так, будто в нем набор N в этом.
Редактировать: Извините, я только что понял, что Chomp не будет работать, если вы не разделите файл в строки, затем Comp Comp в каждой строке, так как Chomp будет только Comp конец входной строки, мое решение не помогло бы в этом случае, однако , вы могли бы разделить его на n N, а затем присоединяйтесь? Мне нравится решение использовать регулярное выражение на строке, возвращенной в ответ ниже. Однако для меня незначительная модификация: включая некоторые дополнительные изменения, поэтому оно все еще отделяет линии, но он проверит либо 2+ N, либо 2+ R's или любая комбинация двух. Тогда возвращая n в это место, таким образом, у него будет только одна новая строка в строке (надеюсь)
$ CONTENT = ~ S / [ N R] + / N / G;
Образовано выше снова, случайно положил! Там по какой-то причине .... не уверен, почему