如何在Win32上只在Perl中打印一个unix换行符?

Kei*_*rup 11 perl newline

默认情况下,perl在win32环境中打印\ r \n.我怎么能覆盖这个呢?我正在使用perl对存储库中的某些源代码进行一些更改,我不想更改所有换行符.

我尝试更改输出记录分隔符,但没有运气.

谢谢!

编辑:想要包含一个代码示例 - 我正在搜索并替换一些遵循相对简单模式的文件,如下所示:

#!/usr/bin/perl
# test.pl

use strict;
use warnings;

$/ = undef;
$\ = "\n"; 
$^I=".old~";

while (<>) {
  while (s/hello/world/) {

  }
  print;
}
Run Code Online (Sandbox Code Playgroud)

对于在cmd行上传递的任何文件,这应该用"world"替换"hello"的任何实例.

编辑2:我尝试了最初binmode没有任何运气的建议.我钻了更多,发现(inplace edit特殊变量)覆盖了.任何工作仍然可以使用inplace编辑?$^Ibinmode

编辑3:作为思南低于所指出的,我需要使用binmode ARGVOUT带有$^I代替binmode STDOUT在我的例子.谢谢.

Sin*_*nür 12

"\n"默认情况下,在Windows上打印到文件句柄会发出一个CARRIAGE RETURN("\015")后跟一个LINE FEED("\012")字符,因为Windows上的标准换行符序列.

这是透明的,所以你需要为特殊的文件句柄覆盖它ARGVOUT(参见perldoc perlvar):

#!/usr/bin/perl -i.bak

use strict; use warnings;

local ($\, $/);

while (<>) {
    binmode ARGVOUT;
    print;
}
Run Code Online (Sandbox Code Playgroud)

输出:

C:\Temp> xxd test.txt
0000000: 7465 7374 0d0a 0d0a                      test....

C:\Temp> h test.txt

C:\Temp> xxd test.txt
0000000: 7465 7374 0a0a                           test..

另请参见perldoc open,perldoc binmodeperldoc perliol(感谢daotoad).

  • 这不是真正的做法.这是文件句柄翻译\ 012.也就是说,如果不写入文本文件句柄,\n仍然只是\ 012. (5认同)
  • 有关Perl IO层的详细讨论,执行此转换的机制,请参阅perldoc perliol - http://perldoc.perl.org/perliol.html (2认同)

PP.*_*PP. 5

有效吗binmode( STDOUT )