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, в зависимости от операционной системы, в которой он работает.