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。