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

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

谢谢!

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

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

use strict;
use warnings;

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

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

  }
  print;
}

这应该替换<!>“hello <!>”的任何实例。 with <!> quot; world <!> quot;对于在cmd行上传递的任何文件。

编辑2 我按照最初的方式尝试了binmode。我深入研究了一下,发现$^I(就地编辑特殊变量)覆盖了binmode ARGVOUT。任何工作仍然可以使用inplace编辑?

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

有帮助吗?

解决方案

默认情况下,将"\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 open perldoc binmode perldoc perliol (感谢 daotoad )。

其他提示

binmode( STDOUT )有效吗?

Re:关于当$^I打开新的输出句柄时binmode丢失的问题,您可以使用 open pragma:

use open OUT => ':raw';

将强制所有为写入而打开的文件句柄都应用':raw'PerlIO层(相当于binmode不带参数)。如果您打开 else 的任何内容,请注意您根据需要应用:crlf或任何其他图层的输出。

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

print "\012";

您正在阅读的数据包含行结尾,因此您将再次将其取回。您可以使用 chomp 自行剥离它们,然后添加自己的结尾,如果你已经设置了binmode,因为Sinan描述了::

while (<>) {
    binmode;
    chomp;        # strip off \r\n
    while (s/search/replace/) {
        # ...
    }
    print;
    print "\n";   # add your own line ending back
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top