ファイルの列挙

作成日: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 の場合、親ディレクトリは'..' ではなく、'::'で表すからだ。 そこで、上記のスクリプトの'..'の部分を'::'に変え、 これだけではエラーは消えないので、'.'も同様に':'に変更した。 これで正常に動作した。

ところが、私は賢明ではない。したがって上記の段落で述べたことがすぐにはわからなかった。 では、どのようにしてわかったのかを次で述べる。

まりんきょ学問所perl手習い > ファイルの列挙


MARUYAMA Satosi