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

时间:2009-11-30 15:59:37

标签: 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;
}

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

编辑2:我按照建议尝试了binmode,但没有运气最初。我深入研究了一下,发现$^I(就地编辑特殊变量)覆盖了binmode。任何工作仍然可以使用inplace编辑?

编辑3:正如Sinan在下面指出的那样,我需要在我的示例中使用binmode ARGVOUT而不是$^I而不是binmode STDOUT。感谢。

5 个答案:

答案 0 :(得分: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;
}

输出:

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 openperldoc binmodeperldoc perliol(感谢daotoad)。

答案 1 :(得分:4)

binmode( STDOUT )是否有效?

答案 2 :(得分:1)

Re:关于在$^I打开新输出句柄时丢失binmode的问题,您可以使用open编译指示解决此问题:

use open OUT => ':raw';

将强制所有为写入而打开的文件句柄都具有':raw'PerlIO层(相当于binmode,没有参数)以应用于它们。如果你打开任何 else 以输出你应用:crlf或任何其他图层的输出,请小心。

答案 3 :(得分:0)

unix换行符是一个LINEFEED字符,它是ASCII码10。

print "\012";

答案 4 :(得分:0)

您正在阅读的数据包含行结尾,因此您将再次将其取回。您可以使用chomp自行删除它们,然后添加自己的结尾,前提是您已设置binmode,因为Sinan描述::

while (<>) {
    binmode;
    chomp;        # strip off \r\n
    while (s/search/replace/) {
        # ...
    }
    print;
    print "\n";   # add your own line ending back
}