この日記の方針。
- この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
- ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
- 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
- perl -e die
2007-02-26 (Mon)今さら気づいた。
■ [メモ] chompが役に立たない

※この問題は解決済みです。追記をお読みください。
id:Cress:20070212:1171244924 の続き。
open( IN, "foo.txt" );
while( <IN> ) {
chomp;
print "'$_' is Numeric.\n" if( /^(\d+)$/ );
}
close( IN );
ファイルから1行ずつ読んで、それが数値だったらダブルクォーテーションでくくって出力するだけという単純なプログラム。
しかし、これがWindows環境だとうまく行かないのである。
UNIXでは改行コードがLF、WindowsだとCRLF。なのに、chompで削る文字がLFに決め打ちされているらしく、Windows環境で作ったテキストファイルだとCRが残ってしまい、正規表現にマッチしない。
以下のコードでOK。
open( IN, "foo.txt" );
while( <IN> ) {
#chomp;
s/\x0D?\x0A$//g;
print "'$_' is Numeric.\n" if( /^(\d+)$/ );
}
close( IN );
これも満たすようにするとこうかな?
s/\x0D?\x0A?$//g;
追記(2007-03-05)
謎が解けました。
で、これに当てはまらない微妙なやつがあります。Cygwinです。
Windows環境で動くくせに、改行コードはUNIXに準拠している。気をつけないとハマる可能性アリ(というかまさにハマった)。
MinGWでコンパイルしたPerlは知らん。手元にないのであとで検証。
もうひとつわかったこと。
perl -e 'print unpack( "C*", $/ ), "\n";'
こうすると、Windows, UNIX, Cygwinとも10が返る*1。この10という値は、0x0A(=LF)のこと。
ファイルをopenして読み込むときに、環境依存の改行コードがすべてLFに変換されている模様。binmodeした場合だけは何もしない。
Windows環境でHTML書くときでも、最初からLFになるように書いているし。
さらに追記
16進数にする方法思い出した。
perl -e 'print unpack( "H*", $/ ), "\n";'
こうでした。簡単でした。
トラックバック - http://perl.g.hatena.ne.jp/Cress/20070226
CygwinのPerl使ってました・・・Active Perlにしたら、chompでもOKでした。ちょっと追記します。
まあ、読み込む時点で改行までしか読まれないので、問題ないといえば問題ないですが。「終端の改行を1個消す」という意味ではなくなってしまいますね。
Unix/binarryでインストールされていますが、CYGWIN=nobinmode してもうまく行きませんでした。
謎です。
Cygwinをご利用の方はご注意ください、で片付いちゃいそうです。テキストファイルの改行コード変換はdos2unixコマンドで一発なので、それで(一応)問題はないかなと。