File::GlobMS

unixのシェルは引数をワイルドカード展開してくれるけどWindowsにはそういう機能はなくて、呼ばれたプログラムの方で展開することになる。perlワイルドカード展開を行う場合に標準で使えるのは CORE::glob(),File::Glob,File::DosGlob,perlglob.exe の4種類。perlglob.exeはVCなどのランタイムを利用するもので文字コードの問題はないが機能的に貧弱、他の三つはcp932などのマルチバイト文字を全く意識しないので「表」などの文字を含むパスをうまくglobできない。 あとCORE::globは指定が空白を含む場合にドライブ指定などのボリューム部分を壊してしまう場合があった。

仕方ないので自分で書いたglobがコレ

  • カレントドライブとカレントディレクトリを正しく扱います。DOS,Windowsではカレントディレクトリはドライブ別に存在していて、C:* は C:.\* と等価であり、 C:\* ではありません。試してないけどUNCパスにも対応?
  • 使用可能なワイルドカードは * ? だけです。ただしVCのランタイムと異なり C:\*\system32\*\hoge のようにディレクトリ指定にもワイルドカードを使用できます。
  • システムのコードページを自動取得します。明示的に指定することも可能です。パターン指定は一度内部コードに変換して、パス区切りごとにバイト列または正規表現に変換します。
  • 幅優先、深度優先、文字コード昇順降順ソートが可能です。