日本語 Windows 環境で Cwd::abs_path がうまく動かない件2015年09月26日 13時42分03秒

Excel 地獄に立ち向かうべく、複数の Excel ファイルから全検索をかけてどうにかするような処理を Perl の Win32::OLE を使って書こうかと思ったんだけど、 OLE での Workbooks.Open メソッドを Perl から呼ぶ場合、カレントディレクトリの解釈が異なるとかの理由でファイル名を絶対パスで渡さなきゃならない。

そこで、 Cwd なるパッケージの abs_path 関数を使ってファイル名の絶対パスを取得して渡すやり方を試してみたんだけど、特定のファイル名をこの関数に渡した時に例外が発生する現象に苛まれて結局その日のうちにツールを完成することができなかった。

手元の環境で再現状況のログを取ることができたので以下に掲載。

C:\Users\murachi\Documents>echo hoge > 確定申告.txt

C:\Users\murachi\Documents>perl -M"Cwd qw/abs_path/" -e "print abs_path('./確定申告.txt')"
./確定申: No such file or directory at -e line 1.

C:\Users\murachi\Documents>echo hoge > 表示画面.txt

C:\Users\murachi\Documents>perl -M"Cwd qw/abs_path/" -e "print abs_path('./表示画面.txt')"
C:/Users/murachi/Documents/示画面.txt
C:\Users\murachi\Documents>echo hoge > 画面表示.txt

C:\Users\murachi\Documents>perl -M"Cwd qw/abs_path/" -e "print abs_path('./画面表示.txt')"
./画面表: No such file or directory at -e line 1.

C:\Users\murachi\Documents>

どうやら内部でファイル名を Shift JIS で取り扱っているらしく、マルチバイト文字のオクテットに 0x5c (ASCII コードで言うところのバックスラッシュ \) を含む文字の取り扱いで文字を潰したりこけたりしてしまっている模様。

まだ試してはいないけど、もしかしたらディレクトリ自体にこういった文字が含まれるようなケースでもしくじるのかもしれない。

何はともあれ、絶対パスは何か別の方法で取ってこないとダメだなぁ…。