Windows の各種Perl実装の改行コードの扱い
Windowsでの、perl の改行コードにはまったので、改行コードがどう扱われてい
るのか調べてみました。
CygwinのPerlは改行コードの扱いがActive Perlとかなり違うようです。\n と指定したら、それは常にLFになるようです。
Active Perlは結構がんばっていて、\n と指定すると、CRLFになってくれるようです。また、CRLFを読み込んでも \n に変換してくれてる。
CygwinのPerlを使ってテンプレートファイル中のキーワードを置換するときに、置換する値に改行が含まれている場合、結構
面倒くさいことになる。入力がCRLFでも、置換すると、置換したところだけ LFとなって、2通りの改行コードが混在する
ファイルになってしまう。
コレを統一するには、Cygwin Perlでは入力をs/[\r\n]//gして改行を駆逐してしまって、出力ファイルにに出力する文字列に
\n を付加してやれば、LFに統一することはできるかな。
\n を書き込んだ場合のファイル中の改行コード
shell経由
perl -e "print qq(Hello\n)" > hello.txt
Cygwin mount状態 bin-mode: LF text-mode: LF Active Perl: CRLF
改行コードの違うファイルがどう見えるか?
hello_lf.txt: 改行コードLFの Hello hello_crlf.txt: 改行コードCRLFの Hello
単純にopenした場合
open(HELLO, q(hello_lf.txt)); $hello = join '', <HELLO>; print " [lf]\\r = ". $hello =~ tr/\r//. "\n"; print " [lf]\\n = ". $hello =~ tr/\n//. "\n"; close HELLO; open(HELLO, q(hello_crlf.txt)); $hello = join '', <HELLO>; print "[crlf]\\r = ". $hello =~ tr/\r//. "\n"; print "[crlf]\\n = ". $hello =~ tr/\n//. "\n"; close HELLO;
Cygwin mount状態 bin-mode [lf]\r = 0 [lf]\n = 1 [crlf]\r = 1 [crlf]\n = 1 text-mode [lf]\r = 0 [lf]\n = 1 [crlf]\r = 1 [crlf]\n = 1 Active Perl [lf]\r = 0 [lf]\n = 1 [crlf]\r = 0 [crlf]\n = 1
bimode で openした場合
open(HELLO, q(hello_lf.txt)); binmode HELLO; $hello = join '', <HELLO>; print " [lf]\\r = ". $hello =~ tr/\r//. "\n"; print " [lf]\\n = ". $hello =~ tr/\n//. "\n"; close HELLO; open(HELLO, q(hello_crlf.txt)); binmode HELLO; $hello = join '', <HELLO>; print "[crlf]\\r = ". $hello =~ tr/\r//. "\n"; print "[crlf]\\n = ". $hello =~ tr/\n//. "\n"; close HELLO;
Cygwin mount状態 bin-mode [lf]\r = 0 [lf]\n = 1 [crlf]\r = 1 [crlf]\n = 1 text-mode [lf]\r = 0 [lf]\n = 1 [crlf]\r = 1 [crlf]\n = 1 Active Perl [lf]\r = 0 [lf]\n = 1 [crlf]\r = 1 [crlf]\n = 1