みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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 );

投稿日時 - 2016-11-12 16:53:11

QNo.9254793

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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のコマンド)

投稿日時 - 2016-11-13 08:24:17

お礼

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

投稿日時 - 2016-11-13 16:37:34

あなたにオススメの質問