このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

MacJPerlのディレクトリ処理について

発言者:kubo
( Date Thursday, September 20, 2001 22:06:13 )


お世話になります。
MacJPerlの初心者です(^^;;;
MacJPerlのディレクトリに関して質問させてください。
MacJPerlのディレクトリはunixとは違うのは
調べて理解したのですが、

例えばあるperlスクリプトを処理をさせたいフォルダの中に
置いたとします。
その中にはさらに複数のフォルダがあったとして、
各フォルダには複数のファイルがあります。
そのファイルすべてに対して同じ処理を繰り返したいのですが、
複数あるフォルダの最後のフォルダを処理してくれません。
存在するすべてのフォルダの中のすべてのファイルを処理させる
にはどうしたらいいのでしょうか?
さらにscriptと処理させたいデータが同一フォルダ内でなくても
処理させることは可能でしょうか?

甘えついでにもう一つ質問させてください。

@files = sort(glob("*")); 
#これを拡張子を指定して

@files = sort(glob("*.txt"));
#とした場合、処理してくれません…
何か根本的に勘違いしているよーな気がするんですが、
どーしてもわかりません。
初歩的な質問かもしれませんが、
どうかご教授願いますm(_ _)m

以下scriptの中身です。

#$path = "." unless $path;
opendir (DIR, $path) or die "opendir $path失敗: $!";
while ($entry = readdir DIR) {
$type = -d "$path:$entry" ? "Dir :" : "File:";


#$dir = 'pwd';
#print $dir;
$dep = 1;
&dirproc($dep);

print "$entry\n";
}
closedir (DIR);

sub dirproc{
my($dep) = @_;
my(@files,$file);
@files = sort(glob("*")); #--最後の質問はこの部分です(^^;;

foreach $file (@files){
if (-f $file) {
for ($i = 1; $i <= $dep; $i++) {
print "\t";
}
print $file."\n";
}
}
foreach $file (@files) {
if (-d $file) {
for ($i = 1; $i <= $dep; $i++) {
print "\t";
}
print $file."\n";
++$dep;
chdir($file);
&dirproc($dep);
--$dep;
}
}
}

Yamada Yasuharu さんからのコメント
( Friday, September 21, 2001 13:41:44 )

 フォルダ内のアイテムのリストを取るのに chdir で、そのフォルダ
へ移動していますが、移動しっぱなしで元へ戻ってないのがうまく動か
ない原因と思います。パスを使って必要な情報を得るようにしてみては
どうでしょうか。

> さらにscriptと処理させたいデータが同一フォルダ内でなくても
> 処理させることは可能でしょうか?

 Perlで処理対象ファイルはコマンドラインで指定しますが、MacJPerl
の場合はスクリプトを Droplet にすると、Drag & Drop したファイル
が処理対象となり @ARGV に入ります。

> @files = sort(glob("*.txt"));
> #とした場合、処理してくれません…

 単純にして

@files = sort(glob("*.txt"));
foreach $file (@files){
  print "$file\n";
}

はどうですか。うちでは動きました。

kubo さんからのコメント
( Wednesday, September 26, 2001 13:20:42 )

Yamada Yasuharu さん、返信遅くなって
スミマセン。
ご指摘の通りキーワードはパスと無用の
foreachを削除した結果、
かなりシンプルなものになりました(^^;;
ただ今ルートディレクトリからの階層の
深さがわからない場合と
ファイル名を配列に入れて別の処理をさせる
scriptにチャレンジ中です。
的確なアドバイスありがとうございました。