2009-11-30 22 views
11

默认情况下,perl在win32环境中打印\ r \ n。我怎样才能覆盖这个?我使用perl对存储库中的某些源代码进行了一些更改,并且我不想更改所有换行符。如何在Win32上打印Perl中的unix换行符?

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

谢谢!

编辑:希望包括一个代码示例 - 我正在做一个搜索和替换在遵循一个相对简单的模式是这样的一些文件:

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

use strict; 
use warnings; 

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

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

    } 
    print; 
} 

这应该取代“任何情况下,你好“在cmd行传递的任何文件都带有”world“。

编辑2:我试过binmode因为没有任何的运气最初建议。我钻了一些,发现$^I(就地编辑特殊变量)被覆盖binmode。任何工作仍然可以使用就地编辑?

编辑3:作为思南低于所指出的,我需要在我的例子使用binmode ARGVOUT$^I,而不是binmode STDOUT。谢谢。

+2

如果更改了输出记录分隔符,那么这是您唯一能做的事情。我猜你会犯一些其他的错误(比如没有正确地分割输入的行,或者不嚼它们)。 – 2009-11-30 16:02:08

+0

你可以举一些当你不需要时打印'\ r \ n'的代码的例子吗? – Ether 2009-11-30 16:58:16

+0

@Sinan,你为什么会认为我不愿意?我不是不愿意。我没有简短的脚本。我有一个非常长,复杂的脚本,可能不会有很大的意义,会更混乱。今晚晚些时候我可以制作一个缩略版。我认为我包括了相关的部分。我不知道当时的编辑是否相关。谢谢。 – 2009-11-30 20:54:47

回答

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 )。

+5

这不是真的\ n做任何事情。这是文件句柄翻译\ 012。也就是说,没有写入文本文件句柄,\ n仍然是\ 012。 – 2009-11-30 17:29:04

+0

@brian d foy:澄清补充说。 – 2009-11-30 17:31:21

+2

有关Perl IO层的详细讨论,请参阅perldoc perliol - http://perldoc.perl.org/perliol.html – daotoad 2009-11-30 17:49:41

4

binmode(STDOUT)是否工作?

+0

+1,是的,部分...见编辑。谢谢。 – 2009-11-30 19:52:03

0

在UNIX换行符是换行字符,这是ASCII代码10

print "\012";

+1

在Windows上:'perl -e“print qq {\ 012}”|除非你设置了'binmode STDOUT',否则xxd'会产生'0000000:0d0a'。 – 2009-11-30 17:18:16

+1

获得正确的角色不是问题。这是在写入文本文件句柄时修改输出的文本模式转换。 – 2009-11-30 17:28:01

+0

感谢您在Windows上纠正我;即使明确告诉了该做什么,我也忘记了perl“帮助”了。 – 2009-12-03 15:53:35

0

您正在阅读的数据包含行结尾,因此您将它们重新取出。你可以自己用chomp剥夺他们关闭,然后加上自己的结局回来,只要你有设置binmode为思南描述::

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

回复:您对binmode问题时$^I打开一个新的输出句柄丢失,你可以用open编译解决这个问题:

use open OUT => ':raw'; 

这将迫使所有的文件句柄打开写有“:原” PerlIO的层(相当于binmode不带参数),以适用于他们。请注意,如果您打开任何其他其他以应用:crlf或任何其他图层所需的输出。