Perlでは、再帰関数を自分で書かなくても、サブディレクトリの探索を行うことができます。この記事では、Perlで指定ディレクトリとサブディレクトリ内にあるファイルやディレクトリの一覧を表示する方法を紹介します。
サンプルコード
Findモジュールは、ディレクトリ構造を再帰的に探索するための関数を提供します。これにより、指定されたディレクトリおよびそのサブディレクトリ内のファイルを簡単に処理できます。
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
# 対象のディレクトリパス
my $dir = '/path/to/directory';
# ディレクトリとサブディレクトリを再帰的に探索し
# 見つけたエントリ毎にコールバック関数 wanted を呼び出す(1)
find(\&wanted, $dir);
# 見つけたエントリ毎に呼び出される関数(2)
sub wanted
{
# $File::Find::nameには現在のファイルのフルパスが格納されている(3)
my $full_path = $File::Find::name;
if (-f $full_path) { # ファイルのみを対象とするフィルタ(4)
print "$full_path\n";
}
}
(1)File::Findモジュールの関数findを呼び出します。ひとつ目の引数は、ディレクトリ内のエントリ毎に呼び出されるコールバック関数への参照(関数ポインタのようなもの)です。ふたつ目の引数は、探索対象のディレクトリへのパスです。
(2)File::Findモジュールの関数findから呼び出されるコールバック関数です。
(3)$File::Find::name には、見つけたエントリのフルパスが格納されています。
(4)ファイルのみを処理対象とする場合、そのパスがファイルかどうかを判定するため if (-f $full_path) を使用します。
ディレクトリ一覧を表示する場合
(4)の処理を以下のようにします。
if (-d $full_path) { # ディレクトリのみを対象とするフィルタ(4)
print "$full_path\n";
}
コールバック関数の名前はwantedでなくてはならないか?
他のサンプルコードにおいても、File::Findモジュールのコールバック関数にはwantedが使われることが多いです。実際にはこのサブルーチンには任意の名前を付けることができます。wantedはあくまで一般的な慣習に基づく名前であり、意味のある名前付けはコードの可読性を高めるために推奨されます。
まとめ
本記事では、Perlで指定ディレクトリとサブディレクトリ内にあるファイルやディレクトリの一覧を表示する方法を紹介しました。