即使我使用binmode编写文件,我仍然会看到windows风格的LF。
# open the files
open (inFile, "<$inFileName") or die "can't open $inFileName: $!\n";
binmode inFile;
open (outFile, ">$outFileName");
binmode outFile;
# get the input file size
$fileSize = -s $inFileName;
# read in the file
sysread(inFile, $fileStr, $fileSize);
# calc the checksum
$strChecksum = unpack("%32C*", $fileStr);
$headerStr = pack(V4,$fileID, $fileFlags, $fileSize, $strChecksum);
print outFile "$headerStr$fileStr";
close inFile;
close outFile;
我希望我的二进制文件中的linux样式LF看到0x0d 0x0a而不是0x0a。 我正在使用activestate perl 5.16.3
任何人都可以帮我找出为什么这个binmode不工作?
答案 0 :(得分:1)
您仍然拥有Windows行结尾,因为您永远不会更改行结尾。
输入句柄上的 binmode
会导致文件内容保持不变。
binmode
会导致标量的内容不变。
如果您的输出文件包含CR LF,那是因为您的输入文件包含CR LF。
你错过了
$fileStr =~ s/\r//g;
或者,只需在输入句柄上取消binmode
。
顺便说一下,sysread
无法保证读取您请求的字节数,因此您的使用会被破坏。使用
1 while sysread(inFile, $fileStr, 64*1024, length($fileStr));
或
{ local $/; $fileStr = <inFile>; }
顺便说一下,
pack(V4, ...)
应该是
pack('V4', ...)
始终使用use strict; use warnings;
!