ファイルの列挙 |
作成日:2000-11-05 最終更新日: |
どのようにしてフォルダーの下のファイルをすべて列挙すればいいのか。 ラクダ本を真似して、次のように書いてみた。
# renovigo03.pl
# 2000-11-03
# MARUYAMA Satosi, All Rights Reserved.
#
$_ = "tako";
chdir $_;
&dodir('.');
sub dodir {
local($dir,$nlink) = @_;
local($dev,$ino,$mode,$subcount);
# トップレベルでは自分でリンク数を取得しなければならない
($dev,$ino,$mode,$nlink) = stat('.') unless $nlink;
# カレントディレクトリの全ファイルを得る。
opendir(DIR,'.') || die "Can't open $dir"; # ここでエラー
local(@filenames) = readdir(DIR);
closedir(DIR);
if ($nlink == 2) { # このディレクトリにはサブディレクトリはない
for (@filenames) {
next if $_ eq '.';
next if $_ eq '..';
print "$dir/$_\n";
}
}
else { # このディレクトリはサブディレクトリを持っている。
$subcount = $nlink - 2;
for (@filenames) {
next if $_ eq '.';
next if $_ eq '..';
$name = "$dir/$_";
print "$name\n";
next if $subcount == 0; # サブディレクトリをすべて処理したか
# リンク数を得ると共に、ディレクトリであるかをチェックする
($dev,$ino,$mode,$nlink) = lstat($_);
next unless -d _;
chdir $_ || die "Can't cd to $name";
&dodir($name,$nlink);
chdir '..';
--$subcount;
}
}
}
すると、次のとおり異常終了した。
# Can't open ..
File 'Macintosh HD:renovigo03.pl'; Line 21
ここで、Line 21 とは「ここでエラー」と注釈文をはさんだ行だ。 ラクダ本の通りにやったのに、動かない。なぜか。
このエラーの原因は、賢明な読者ならおわかりだろう。 このコンピュータが Macintosh であることが原因だ。 Macintosh の場合、親ディレクトリは'..' ではなく、'::'で表すからだ。 そこで、上記のスクリプトの'..'の部分を'::'に変え、 これだけではエラーは消えないので、'.'も同様に':'に変更した。 これで正常に動作した。
ところが、私は賢明ではない。したがって上記の段落で述べたことがすぐにはわからなかった。 では、どのようにしてわかったのかを次で述べる。