Perl打印二进制文件 - cr lf

时间:2013-08-13 11:58:11

标签: perl printing binaries

我不是一名普通的Perl程序员,我在论坛上找不到任何关于此内容的东西,或者我找不到几本书。

我正在尝试使用构造将二进制数据写入文件:   print filehandle $ record

我注意到,当遇到x'0A'时,我的所有记录都会被截断,所以显然Perl使用LF作为记录结束指示符。如何使用例如长度说明符编写完整记录?我担心Perl也会篡改其他二进制“非printables”。

感谢 弗里茨

2 个答案:

答案 0 :(得分:2)

您想要使用

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

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

防止修改。输出句柄也是如此。


这种“0A截断”的说法听起来好像你正在使用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;
   ...
}

答案 1 :(得分:1)

Perl不是&#34;篡改&#34;与你的写作。如果您的记录在遇到换行符时被截断,那么读取它们的代码就会出现问题,而不是编写它们的代码。 (除非格式指定必须转义换行符,在这种情况下,#34;问题&#34;编写文件的代码是没有篡改数据(通过转义换行符,而是准确写出你告诉它的内容。)

请提供一个小的(但可运行的)代码示例,演示您的问题,理想情况下包括阅读和写作,以及实际结果和所需结果,我们将能够提供更具体的帮助。

但请注意,\n不会直接映射到单个数据字节(ASCII字符),除非您处于二进制模式。如果正在以文本模式读取或写入文件,\n可能只是CR,只是LF或CRLF,具体取决于它在其下运行的操作系统。