我不是一名普通的Perl程序员,我在论坛上找不到任何关于此内容的东西,或者我找不到几本书。
我正在尝试使用构造将二进制数据写入文件: print filehandle $ record
我注意到,当遇到x'0A'时,我的所有记录都会被截断,所以显然Perl使用LF作为记录结束指示符。如何使用例如长度说明符编写完整记录?我担心Perl也会篡改其他二进制“非printables”。
感谢 弗里茨
答案 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,具体取决于它在其下运行的操作系统。