Perlのchomp

Perlのchompは、文字列の最後の改行コードを削除してくれる関数ですが、ちょっと癖があります。

Perlでテキストファイルの読み込みをする時に次のように使ったりします。


open( IN, "hoge.txt" );
while( <IN> ) {
    chomp;
    print length;
    print "\n";
}
close( IN );

これは単にテキストファイルの内容を読みこんで、各行の長さを表示しているだけです。

各OSで作成したファイルをそのOSで処理する分にはこれで問題ないのですが、例えばWindowsで作成したテキストファイルをMacで処理すると問題が発生します。

Windowsのメモ帳で次の内容のhoge.txtを作成し、


a
bb
ccc

Macで上のスクリプトを動かすと、結果は


2
3
4

と表示されます。期待した長さより1大きな値が表示されてしまいます。

これは、各OS間の改行コードの相違に起因しています。

Windowsのテキストファイルの標準の改行コードはCRLFですが、MacやLinuxの標準の改行コードはLFです。

そして、chomp関数は、各OSの改行コードしか削除してくれません。なので、Macで動かした時、CRLFのLFしか削除されず、CRが文字列にくっついたままになっています。そのため上のような結果になってしまいました。

 

このような場合は、chompを使わず、正規表現で改行コードを削除してやれば文字列の部分だけ取り出せます。


open( IN, "hoge.txt" );
while( <IN> ) {
    s/[\r\n]+$//;
    print length;
    print "\n";
}
close( IN );

 

最近はPerlを使う機会は少なくなってきたのですが、たまに使うとちょっとしたことでハマってしまいます。今日もこれでハマってしまいました。

ところで、Perlといえば普通Perl5を指しますが、別の言語と言われるPerl6はなかなか気軽に使える状況にならないですね。もう登場からかれこれ10年以上たっているのですが。