我有一个小例程,我在文件上应用一些正则表达式并将整个内容写入一个新文件。
perl -p -e "myRegexReplace" %INPUT% >%OUTPUT%
该脚本在 Windows 机器上执行。
出于测试目的,我有一个仅包含 Unix Linebreaks 的文件LF
。但是,在处理文件后,换行符是CRLF
格式。
如何防止 perl 更改换行格式?
更新@阿蒙:
STDIN :unix
STDIN :crlf
STDOUT :unix
STDOUT :crlf
我有一个小例程,我在文件上应用一些正则表达式并将整个内容写入一个新文件。
perl -p -e "myRegexReplace" %INPUT% >%OUTPUT%
该脚本在 Windows 机器上执行。
出于测试目的,我有一个仅包含 Unix Linebreaks 的文件LF
。但是,在处理文件后,换行符是CRLF
格式。
如何防止 perl 更改换行格式?
更新@阿蒙:
STDIN :unix
STDIN :crlf
STDOUT :unix
STDOUT :crlf
从 PerlIO 文档:
:crlf
一个实现 DOS/Windows 的层,如 CRLF 行尾。读取时将 CR、LF 对转换为单个“\n”换行符。写入时将每个 "\n" 转换为 CR,LF 对。请注意,该层将默默地拒绝被推到自身之上。
它目前不模仿 MS-DOS 将 Control-Z 视为文件结束标记。
所以在输出时,LF 被转换为不需要的 CRLF。
要删除这一层,我们希望获得原始文件句柄而不需要字节咀嚼。此脚本演示如何使用binmode
更改图层:
use feature 'say';
print_layers();
# remove any byte-munching layers (:crlf, :utf8)
# this would also be a nice place to add `:utf8` or some `:encoding(...)`
binmode $_, ":raw" for STDIN, STDOUT, STDERR;
print_layers();
sub print_layers {
say "== Layers ==";
for my $fh (STDIN, STDOUT, STDERR) {
say "$fh :$_" for PerlIO->get_layers($fh);
}
}
输出应该是:
== Layers ==
STDIN :unix
STDIN :crlf
STDOUT :unix
STDOUT :crlf
STDERR :unix
STDERR :crlf
== Layers ==
STDIN :unix
STDOUT :unix
STDERR :unix
我不知道如何说服open
编译指示为我做这件事。