Windows の各種Perl実装の改行コードの扱い

Windowsでの、perl の改行コードにはまったので、改行コードがどう扱われてい
るのか調べてみました。

CygwinPerlは改行コードの扱いがActive Perlとかなり違うようです。\n と指定したら、それは常にLFになるようです。
Active Perlは結構がんばっていて、\n と指定すると、CRLFになってくれるようです。また、CRLFを読み込んでも \n に変換してくれてる。
CygwinPerlを使ってテンプレートファイル中のキーワードを置換するときに、置換する値に改行が含まれている場合、結構
面倒くさいことになる。入力がCRLFでも、置換すると、置換したところだけ LFとなって、2通りの改行コードが混在する
ファイルになってしまう。
コレを統一するには、Cygwin Perlでは入力をs/[\r\n]//gして改行を駆逐してしまって、出力ファイルにに出力する文字列に
\n を付加してやれば、LFに統一することはできるかな。

環境

Cygwin:
perl: v5.8.7
bash: version 3.1.17(5)

Avtive Perl: v5.8.8

\n を書き込んだ場合のファイル中の改行コード

shell経由
perl -e "print qq(Hello\n)" > hello.txt
Cygwin
 mount状態
   bin-mode:  LF
   text-mode: LF

Active Perl:   CRLF
ダイレクト
perl -e "open(OUT, q(>hello.txt)); print OUT qq(Hello\n)"
Cygwin
 mount状態
   bin-mode:  LF
   text-mode: LF

Active Perl:   CRLF
ダイレクト binmode
perl -e "open(OUT, q(>hello.txt)); binmode OUT; print OUT qq(Hello\n)"
Cygwin
 mount状態
   bin-mode:  LF
   text-mode: LF

Active Perl:   LF

改行コードの違うファイルがどう見えるか?

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