Perl将二进制文件打印到文件-cr lf
我不是一个普通的Perl程序员,我在论坛或我的几本书中都找不到关于这方面的任何东西 我正在尝试使用以下结构将二进制数据写入文件: 打印filehandle$record 我注意到,当遇到x'0A'时,我的所有记录都会被截断,因此显然Perl使用LF-as和end-of-record指示符。如何编写完整的记录,例如使用长度说明符?我还担心Perl会篡改其他二进制“非打印内容” 谢谢 FritzPerl不会“篡改”您的写入。如果您的记录在遇到换行符时被截断,那么这是读取它们的代码的问题,而不是写入它们的代码的问题。(除非格式指定必须转义换行符,否则在这种情况下,写入文件的代码的“问题”在于它不会篡改数据(通过转义换行符),而是准确地写入您告诉它的内容。) 请提供一个小的(但可运行的)代码示例来演示您的问题,理想情况下包括读写,以及实际结果和期望的结果,我们将能够提供更具体的帮助 但是,请注意,Perl将二进制文件打印到文件-cr lf,perl,printing,binaries,Perl,Printing,Binaries,我不是一个普通的Perl程序员,我在论坛或我的几本书中都找不到关于这方面的任何东西 我正在尝试使用以下结构将二进制数据写入文件: 打印filehandle$record 我注意到,当遇到x'0A'时,我的所有记录都会被截断,因此显然Perl使用LF-as和end-of-record指示符。如何编写完整的记录,例如使用长度说明符?我还担心Perl会篡改其他二进制“非打印内容” 谢谢 FritzPerl不会“篡改”您的写入。如果您的记录在遇到换行符时被截断,那么这是读取它们的代码的问题,而不是写入它
\n
不会直接映射到单个数据字节(ASCII字符),除非您处于二进制模式。如果以文本模式读取或写入文件,\n
可能只是CR、LF或CRLF,具体取决于运行该文件的操作系统。Perl不会“篡改”您的写入操作。如果您的记录在遇到换行符时被截断,那么这是读取它们的代码的问题,而不是写入它们的代码的问题。(除非格式指定必须转义换行符,否则在这种情况下,写入文件的代码的“问题”在于它不会篡改数据(通过转义换行符),而是准确地写入您告诉它的内容。)
请提供一个小的(但可运行的)代码示例来演示您的问题,理想情况下包括读写,以及实际结果和期望的结果,我们将能够提供更具体的帮助
但是,请注意,\n
不会直接映射到单个数据字节(ASCII字符),除非您处于二进制模式。如果文件是以文本模式读取或写入的,\n
可能只是CR、LF或CRLF,具体取决于运行该文件的操作系统。是否要使用
open(my $fh, '<', $qfn) or die $!;
binmode($fh);
另一种选择是使用read
while (1) {
my $rv = read($fh, my $rec, 4096);
die $! if !defined($rv);
last if !$rv;
...
}
- (又名
和
)
open(my $fh, '<', $qfn) or die $!;
binmode($fh);
另一种选择是使用read
while (1) {
my $rv = read($fh, my $rec, 4096);
die $! if !defined($rv);
last if !$rv;
...
}
- (又名
和
)
sysread
将读取尽可能多的可用数据并返回该数据。你可以把你读到的内容累加在一个buf中,然后检查你是否有一个完整的框架。(my$buf,而(1){my$rv=sysread($fh,$buf,64*1024,length($buf));die if!defined($rv);last if!$rv;…}
)如果这不起作用,$ser
可能很神奇,如果用sysread
代替read
,它可能会起作用。这就是我需要的。我正在使用从打开的串行端口“$inrec=”读取的数据,该端口在\r\n字节处停止。我正在重写例程,以使用您提到的binmode,并读取过去的\r\n。我可以在后期处理中整理单个(可变长度)记录。不幸的是,我不能保证固定的记录长度,因为端口有时会丢失一个字节或2个。@Fritz,sysread
将读取尽可能多的可用数据并返回该数据。你可以把你读到的内容累加在一个buf中,然后检查你是否有一个完整的框架。(my$buf,而(1){my$rv=sysread($fh,$buf,64*1024,length($buf));die if!defined($rv);last if!$rv;…}
)如果这不起作用,$ser
可能很神奇,如果用sysread
代替read
,它可能会起作用。