我有一个小例程,我在文件上应用了一些正则表达式,并将整个内容写入新文件。
perl -p -e "myRegexReplace" %INPUT% >%OUTPUT%
脚本在Windows机器上执行。
出于测试目的,我有一个只包含Unix Linebreaks LF
的文件。但是,处理完文件后,换行符为CRLF
格式。
如何防止perl更改换行格式?
更新@ amon:
STDIN :unix
STDIN :crlf
STDOUT :unix
STDOUT :crlf
答案 0 :(得分:2)
来自PerlIO文档:
:CRLF
实现DOS / Windows的层,如CRLF行结尾。在读取时将CR,LF对转换为单个“\ n”换行符。在写入时将每个“\ n”转换为CR,LF对。请注意,此图层将默默地拒绝将其推到自身之上。
就Control-Z作为文件结束标记而言,它目前不能模仿MS-DOS。
因此在输出时,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
pragma为我做这件事。
答案 1 :(得分:1)