Perl, печатающий двоичные файлы - cr lf

Я не обычный программист на Perl, и я не смог найти ничего об этом на форуме или в нескольких моих книгах.

Я пытаюсь записать двоичные данные в файл с помощью конструкции: print filehandle $record

Я отмечаю, что все мои записи усекаются при обнаружении x'0A, так что, очевидно, Perl использует LF как и индикатор конца записи. Как я могу написать полные записи, используя, например, спецификатор длины? Я также беспокоюсь о том, что Perl может вмешиваться в другие двоичные файлы, не предназначенные для печати.

спасибо Фриц

2 ответа

Вы хотите использовать

open(my $fh, '<', $qfn) or die $!;
binmode($fh);

или же

open(my $fh, '<:raw', $qfn) or die $!;

для предотвращения изменений. То же самое касается выходных ручек.


Этот разговор "усечение при 0А" звучит так, как будто вы используете readline и ожидайте сделать что-то кроме чтения строки.

Ну, на самом деле, это возможно! Вам просто нужно сказать readline Вы хотите, чтобы он читал записи фиксированной ширины.

local $/ = \4096;
while (my $rec = <$fh>) {
   ...
}

Другой альтернативой было бы использовать read,

while (1) {
   my $rv = read($fh, my $rec, 4096);
   die $! if !defined($rv);
   last if !$rv;
   ...
}

  • binmode
  • open
  • read
  • readline (ака <> а также <$fh>)
  • $/

Perl не "вмешивается" в ваши записи. Если ваши записи усекаются, когда они сталкиваются с переводом строки, то это проблема кода, который их читает, а не кода, который их пишет. (Если формат не указывает, что переводы строки должны быть экранированы, в этом случае "проблема" с кодом, пишущим файл, заключается в том, что он не вмешивается в данные (путем экранирования перевода строки), а вместо этого записывает именно то, что вы говорите.)

Пожалуйста, предоставьте небольшой (но работающий) пример кода, демонстрирующий вашу проблему, в идеале включающий чтение и запись, а также реальный результат и желаемый результат, и мы сможем оказать более конкретную помощь.

Обратите внимание, однако, что \n не отображается непосредственно на один байт данных (символ ASCII), если вы не находитесь в двоичном режиме. Если файл читается или записывается в текстовом режиме, \n может быть просто CR, просто LF или CRLF, в зависимости от операционной системы, в которой он работает.

Другие вопросы по тегам