2007-04-26

filenameプラグマの使い途(その1、encodingプラグマとの併用)

 メンテナの方から蛇蝎のごとく嫌われているencodingプラグマですが*1、使いようによっては便利です。

 でまあこんなコードを書いたりするのですが、

use encoding 'cp932', STDIN => 'cp932', STDOUT => 'cp932';
use open IO => ':encoding(cp932)';

# CP932な文字列を含んだコード

――これだとマルチバイトなファイル/ディレクトリを扱えないというか、自前で変換コードを書かないといけなくて、少なくともjperlの代わりにはならない。

 というわけでそれを自動化するプラグマとしてのfilename。

use encoding 'cp932', STDIN => 'cp932', STDOUT => 'cp932';
use open IO => ':encoding(cp932)';
use filename 'cp932', ':globally';

# CP932な文字列を含んだコード

 これで一歩jperlに近づいた、はず。

 ところで、openプラグマにも:globallyな指定は欲しいところ*2

ファイルを扱うCORE::*関数はまだまだあるんだよね……

 適当にコードを書いていたら足りない関数があるのに気付いた。調べたらけっこうあるのね。

Functions for filehandles, files, or directories

-X, chdir, chmod, chown, chroot, fcntl, glob, ioctl, link, lstat, mkdir, open, opendir, readlink, rename, rmdir, stat, symlink, sysopen, umask, unlink, utime

 まあ使うモノから順に埋めていけばいいとして、ファイルテスト演算子はどうすりゃいいんだろ。

 このあたりのことを考えると、標準機能としてサポートして欲しいなぁ。。。

use encoding ':locale'とかできるようになってたのね。

 知らんかった。

 openプラグマでも使えるみたいだし、filenameプラグマでも使えるようにするか。役に立つか微妙だけど*3

*1:5.8のリリース当初はいぢり倒して不具合を見つけてたし。

*2:filenameプラグマに:globallyをつけたのはFile::Globを見て。指示子は他のがいいのかな?

*3:Win32上で取得できないので。