linux LF在我的perl脚本中不起作用

时间:2014-02-12 03:01:27

标签: linux perl

即使我使用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不工作?

1 个答案:

答案 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;