第8章ではファイルのオープンやクローズ、ファイル入出力などのファイル操作に関していろいろと見てきました。 第9章では、ディレクトリの操作について簡単に触れていきたいと思います。
Perlでファイルを扱う際に、ファイルハンドルを使ったのと同じように、Perlでディレクトリを扱うにはディレクトリハンドルと言う物を使います。 ディレクトリハンドルとはPerlがディレクトリを扱うときに使う名前のことで、ファイルハンドルのディレクトリ版のようなものです。 ディレクトリハンドルは自由に決めることが出来ます。 ファイルハンドル同様、独自の名前空間で管理されるので、変数名やファイルハンドルと重複しても大丈夫です。 ただ、今後定義されるかもしれない予約語と重なってしまわないように、大文字の英文字で定義することが推奨されています。
ディレクトリハンドルをオープンするにはopendir関数を使います。 なんとも直感的でわかりやすいですね。 opendir関数の構文は次の通りです。
opendir(ディレクトリハンドル, 式);
opendir関数はディレクトリハンドルと、オープンしたいディレクトリ名(またはそれを格納したスカラー変数)を受け取ります。
opendir(DH, "/docs")
or die "/docs can't open:$!";
上の例ではdie関数を使ってopendirに失敗したときのエラー処理を行っています。 ディレクトリのオープンがファイルのオープンと決定的に違うのは、ディレクトリは常に読み取り専用でオープンされると言う点です。 まあ、ディレクトリに何かを書き込もうとしても意味はありませんが。
さて、ディレクトリを開いたら今度は閉じましょう。 ディレクトリのクローズにはclosedir関数を使います。
closedir(ディレクトリハンドル);
closedir関数は、受け取ったディレクトリハンドルをクローズします。
オープンしたディレクトリの中身を読み取るにはreaddir関数を使います。 readdir関数はディレクトリハンドルを受け取ります。 次のスクリプトは、/docs ディレクトリの中身を読み取って、順番に出力する物です。
opendir(DH, "/docs")
or die "/docs can't open:$!";
while($file = readdir(DH)) {
print "$file\n";
}
closedir(DH);上のようにreaddir関数をスカラーコンテキストで評価すると、ディレクトリハンドルで結び付けられたディレクトリ内の(パスのない)ファイル名を順に返します。 上のスクリプトを実行すると、最初に"."だけ、次に".."が帰ってきます。 "."は/docsディレクトリその物を表し、".."は/docsディレクトリの1つ上のディレクトリを(もしそれがあれば)表します。 /docsディレクトリの親ディレクトリがない場合には/docsディレクトリ自身を表します。 またreaddir関数をリストコンテキストで評価することも出来ます。 この場合は読み取った全ファイル名からなるリストを返します。 デスから上のスクリプトを次のように変更することも出来ます。
opendir(DH, "/docs")
or die "/docs can't open:$!";
@files = readdir(DH);
foreach $file (@files) {
print "$file\n";
}
closedir(DH);この節ではディレクトリのオープンやクローズ、ディレクトリの中身を読み取る方法を見てきました。 次の節ではディレクトリの作成や削除、移動について紹介します。