2009-11-30 4 views
11

デフォルトでは、perlは\ r \ nをwin32環境で印刷します。これをどのように無効にすることができますか?私は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を試してみました。私は少し掘り下げて、(インプレース編集の特別な変数)がbinmodeを無効にしていたことを発見しました。インプレイス編集を使用できるようにするにはどうすればよいですか?

編集3:シナンは、以下の指摘するように、私は私の例では$^I代わりのbinmode STDOUTbinmode ARGVOUTを使用する必要がありました。ありがとう。

+2

出力レコード区切り文字を変更した場合は、これが唯一のことでした。私はいくつかの間違いを犯したのではないかと思います。 –

+0

'\ r \ n'を表示したくないコードの例を挙げることができますか? – Ether

+0

@シーナン、なぜあなたは私が不本意だと思うだろうか?私は不本意ではない。私は簡単なスクリプトを用意していません。私は非常に長くて複雑なスクリプトを持っていて、おそらくそれほど意味をなさないでしょうし、さらに混乱するでしょう。私は今晩後で短縮版を作ることができます。私は関連する部分を含めていると思った。私は現時点で編集が適切だったことを知らなかった。どうも。 –

答えて

12

は、デフォルトでは、放出され、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

それは本当に何もしていません。これは\ 012を翻訳するファイルハンドルです。つまり、テキストファイルハンドルに書き込むことなく\ nは\ 012です。 –

+0

@brian d foy:明確化が追加されました。 –

+2

Perl IOレイヤーの詳細については、この変換を行うメカニズムをご覧ください。perldoc perliol - http://perldoc.perl.org/perliol.html – daotoad

4

binmode(STDOUT)は機能しますか?

+0

+1、はい、部分的に...編集を参照してください。どうも。 –

0

A、UNIXの改行は、Windows上のファイルハンドルに"\n"を印刷するASCIIコードである改行文字、10

print "\012";

+1

Windowsの場合: 'perl -e" print qq {\ 012} "| 'xmd'は' binmode STDOUT'をセットしない限り '0000000:0d0a'を出力します。 –

+1

正しい文字を取得することは問題ありません。これは、テキストファイルハンドルに書き込むときに出力を変更するテキストモード変換です。 –

+0

Windowsで私を訂正してくれてありがとう。私は、たとえ明示的に何をすべきかを指示されたとしても、 "助けられた"ということを忘れてしまいました。 –

0

あなたが読んでいるデータには行末が含まれているため、それらを再び取り戻しています。その後、シナンが説明として、あなたがのbinmodeを設定していて、戻ってあなた自身のエンディングを追加し、chompを自分でそれらを取り除くことができます::

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

日時:$^Iは新しい出力ハンドルを開いたときに失われているのbinmodeに関するご質問、

use open OUT => ':raw'; 

すべてのファイルハンドルを持つように書き込み用に開か強制します:それらに適用するためにはPerlIO層(引数なしでbinmodeに相当)「:生」を、あなたはopenプラグマでこれを解決することができます。 :crlfまたは必要に応じてその他のレイヤーを適用する場合は、、それ以外の場合はのいずれかを開く場合は注意してください。

関連する問題