Perlでマルチバイトなファイル名を扱えないというFUD

UTF8文字列をファイル名として扱った場合にprint等と違ってwarningが出ないのは仕様としては不思議だな、と思いますけれど。

不思議でもなんでもない。CP932環境では文字化けして見えるというだけで、ファイルそのものは正しく扱えていますもの。だから、たとえばWindows上でこんなスクリプトをutf8で書いて実行すると、ファイル名こそ「繝輔ぃ繧、繝ォ.txt」なんてなるけど、ファイルの中にはきちんとhogeという文字列が保存されている。浅倉さんが期待した通りの結果にならないからって、仕様的に間違っていない動作をしているプログラムを責めるのは筋違いだ。

#!/usr/bin/perl
use utf8;
open my $fh, '>', 'ファイル.txt';
print $fh 'hoge';
close $fh;

ついでに言うと、本当に浅倉さんの要求を額面通りに受け取るなら、filenameプラグマは的はずれだろう(そんなことをするくらいならIO::Allにファイル名をいじくるオプションでもつけてもらった方がいい)。むしろ裏でLANG環境変数や、Windowsの場合ならWin32::LocaleとかWin32::Codepageを呼ぶような仕組みを組んでユーザにコードページを意識させないようなつくりにするべきだ。たとえばCPANモジュールのテストに埋め込むとき、ユーザのコードページなんてわからないのが普通なんだから。

もっとも、実用上はそんなことをしなくてもファイル操作の前にencodeなりなんなりを呼んでおけば済む話ではある。CP932環境で使う場合、問題になるのはむしろバックスラッシュ問題(あるいはコロン問題)の方であって、ファイル名のマルチバイト部分そのものが問題になることなんてほとんどない。Perlオープンソースなんだから、という議論はさておくとしても、少なくともこの件で弾さんに突っかかるのはお門違いだと思いますよ。