2009-11-30 21 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或任何其他圖層所需的輸出。