くれすのPerl日記 このページをアンテナに追加 RSSフィード

この日記の方針。

  1. この日記では、超初心者向けの内容は取り扱っておりません。モジュールの利用など、実践的な内容が中心となります。
  2. ここに貼られるソースは、基本的にそのままでは動かないものばかりです。各自の責任でご利用ください。
  3. 内容が間違っていることがあります。その際はご指摘いただけるとありがたいです。「検証してみたら違う結果が出た」などの報告も大歓迎です。
  4. perl -e die

2007-02-26 (Mon)今さら気づいた。

[] chompが役に立たない 12:52  chompが役に立たない - くれすのPerl日記 を含むブックマーク はてなブックマーク -  chompが役に立たない - くれすのPerl日記  chompが役に立たない - くれすのPerl日記 のブックマークコメント

※この問題は解決済みです。追記をお読みください。

id:Cress:20070212:1171244924 の続き。

open( IN, "foo.txt" );
while( <IN> ) {
    chomp;
    print "'$_' is Numeric.\n" if( /^(\d+)$/ );
}
close( IN );

ファイルから1行ずつ読んで、それが数値だったらダブルクォーテーションでくくって出力するだけという単純なプログラム

しかし、これがWindows環境だとうまく行かないのである。

UNIXでは改行コードLFWindowsだと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 );

あー、でもこれだとMacCRには対応できないか。

これも満たすようにするとこうかな?

s/\x0D?\x0A?$//g;

手元にMac環境ないので試せないです。。。

追記(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した場合だけは何もしない。


・・・というか、めんどいから全部LFで良いじゃん。って。

Windows環境HTML書くときでも、最初からLFになるように書いているし。

さらに追記

16進数にする方法思い出した。

perl -e 'print unpack( "H*", $/ ), "\n";'

こうでした。簡単でした。

*1:16進数にする方法を失念。やむなく10進数に。

  2007/03/04 21:41$/使えないかしら?

tokuhiromtokuhirom2007/03/05 00:21s/[\r\n]+//g; と書くと楽です

wtnabewtnabe2007/03/05 08:13Windows で動かないと言うのは逆じゃないですかね。Windows とは異なる改行コードを持っているシステムでうまく動かないと言うなら分かります。Windows で再現させるためには binmode を使うとか cygwin の Perl を使うとかちょっと特殊な条件が必要だと思います。

CressCress2007/03/05 13:20謎が解けました。
CygwinのPerl使ってました・・・Active Perlにしたら、chompでもOKでした。ちょっと追記します。

CressCress2007/03/05 13:36tokuhiromさんのだと、余計なのまで消えちゃいません?
まあ、読み込む時点で改行までしか読まれないので、問題ないといえば問題ないですが。「終端の改行を1個消す」という意味ではなくなってしまいますね。

wtnabewtnabe2007/03/05 15:31cygwin も LF 決め打ちじゃないような…。たぶん cygwin のインストール時にシステムのデフォルトの改行コードを指定すると思います。久しく触っていないので最近の事情と合わないかもしれませんが、環境変数 CYGWIN に binmode があると、改行コードが LF であるものとして動作するんじゃなかったでしたっけ?

CressCress2007/03/05 16:39今確認したところ、setup.exeに改行コードの設定がありました。Unix/binnary(RECOMMENDED) って書いてありますね。
Unix/binarryでインストールされていますが、CYGWIN=nobinmode してもうまく行きませんでした。
謎です。

wtnabewtnabe2007/03/05 17:50手元に cygwin の入っている機械を見つけたので試してみましたけど、cygwin のシェル上から環境変数を設定しても、Windows の方から環境変数を設定して(再起動して)も反映されないっぽいですね。いつからか動作が変わったんでしょう。もしかしたらコマンドによって効いたり効かなかったりっていうのもあるかもしれませんけど、そもそも切り替わったりしない方が分かりやすいんで、気にしない方がいいかもしれません。

CressCress2007/03/06 07:45なんかCygwinがバグくさいですね。。。
Cygwinをご利用の方はご注意ください、で片付いちゃいそうです。テキストファイルの改行コード変換はdos2unixコマンドで一発なので、それで(一応)問題はないかなと。

トラックバック - http://perl.g.hatena.ne.jp/Cress/20070226