• 締切済み

Perl で File::Find できない

Perl 初心者です。Windows 上で、親ディレクトリを ARGV に引き渡してすべてのサブディレクトリを再帰的に処理するスクリプトを作成しましたが、名前に「表」の漢字が含まれているディレクトリだと、処理が失敗します(その他のディレクトリでは正常に動作します)。調べたところ、以下のサイトで指摘されている問題らしく、いろいろと書き直しては見たのですがうまく動きません。ご教示いただけないでしょうか。 参照したサイト -------------- 「WindowsのPerlで日本語パス名を処理すると0x5C文字でつまずく」 http://raven.air-nifty.com/night/2009/12/windowsperl0x5c.html 作成したスクリプト(抜粋) ------------------------- my $top_dir = $ARGV[0]; find( \&hogehoge, $top_dir );

みんなの回答

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

Windows環境のPerlでは ファイル名やディレクトリ名やコマンドライン引数@ARGVは Windows-31J(またはCP932。厳密には違うけどShift_JISと呼ばれることも)という文字コードで扱われますが、 File::Findは(というかPerl全体的に)Windows-31Jを考慮していないので うまく動作しないのだと思います。 opendirとかを駆使して自力で再帰処理するか、 Win32::Unicode::Dir::findWのようなunicodeで処理できるモジュールを使うかだと思います。 Win32::Unicode::Dir - search.cpan.org http://search.cpan.org/~xaicron/Win32-Unicode-0.38/lib/Win32/Unicode/Dir.pm 正直なところ、Perlで日本語を含んだファイル・ディレクトリの処理は初心者には厳しいと思います。 私もWindows上でPerlを使うことはありますが、 ファイルの再帰リストアップとかはやるとしてもPerlの外(呼び出し側でループを回すとか、リストをファイルで持つとか)でやりたいですね。 Perlの外でやるという意味では、 print `dir /b /s $ARGV[0]`; は解の1つかもしれませんが、もはやPerlを使っていると言えない気も^^; (dirコマンドはWindowsのコマンド)

cat-rice
質問者

お礼

ご回答ありがとうございました。モジュールがあるのですね。確かに Win32::Unicode::Dir をCPAN からインストールするのが一番早いと思いましたが、サーバー側の原因か、失敗しました。print `dir /b /s $ARGV[0]`; を使う方法も、少し試しましたが自分の能力ではできません。これ以上時間もかけられないため、私では現状無理なようです。ありがとうございました。