默认情况下,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
。感谢。
答案 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 open,perldoc binmode和perldoc 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
}