Почему на веб-странице, загружаемой с помощью Perl, появляются дополнительные разрывы строк? - PullRequest
3 голосов
/ 14 октября 2010

Я пишу простой Perl-скрипт (в Windows) для загрузки ответа на запрос get в 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);

Полагаю, я мог бы просто получить wgetWindows , но теперь это беспокоит меня.Как мне избавиться от лишних разрывов строк?!

Ответы [ 3 ]

12 голосов
/ 14 октября 2010
  1. В вашем примере кода нет нормальной причины для режима >+.Просто говорю.
  2. LWP::Simple имеет метод getstore.Если вы используете LWP::Simple, почему бы не использовать его?
  3. По умолчанию open будет толкать слой :crlf I / O при работе на win32, что превращает \n в \r\n,Но данные, которые вы пишете, уже имеют \r\n, так что вы в конечном итоге получаете слишком много новых строк.Если вы хотите, чтобы данные были записаны дословно, вы должны использовать binmode или открыть дескриптор с помощью :raw для начала.LWP уже делает это правильно.
4 голосов
/ 14 октября 2010

Я предполагаю, что $content уже включает переводы строк CRLF, а уровень IO в Perl выполняет преобразование LF -> CRLF.(Внутренне "\ n" - это один символ в Perl, обычно LF).Я бы добавил

binmode(outputFile);

после open, чтобы отключить это преобразование и записать результаты $content напрямую.

0 голосов
/ 14 октября 2010

chomp ($ content) будет моим предположением. похоже, в нём уже есть набор \ n.

EDIT: Извините, я только что понял, что chomp не будет работать, если вы не разбиваете файл на строки, а затем разбиваете каждую строку, так как chomp будет только разбивать конец входной строки, мое решение в этом случае не поможет может разделить его на \ n \ n, а затем присоединиться? Мне нравится решение использовать регулярное выражение в строке, возвращенной в ответе ниже. однако для меня незначительная модификация: включая некоторые дополнительные изменения, поэтому он все еще разделяет строки, но будет проверять наличие 2+ \ n или 2+ \ r или любую комбинацию двух. затем возвращая \ n вместо него, таким образом, в каждой строке будет только одна новая строка (надеюсь)

$ content = ~ s / [\ n \ r] + / \ n / g;

РЕДАКТИРОВАНИЕ Прежде всего, случайно положить! там по какой-то причине .... не знаю, почему

...