如果你想要将一个动作应用到某个目录及其所有子目录里的所有文件上,那么File::Find模块可以提供完美的解决方案。
从File::Find可以衍生出一个简单的find程序,它会接受代码参照以及目录的列表。代码参照被调用,用在指定目录及其子目录里的每个条目(文件或者目录)上。
在find调用代码参数之前,它会转换到正在被访问的目录。变量File::Find::dir被设置为当前的目录路径。变量File::Find::name包含有正在被访问的文件或者目录的完整路径,而$_则包含有基本名字(base name)。
下面的例子会打印出目录结构:
useFile::Find;
push @ARGV, '.' if (! @ARGV);
find &display, @ARGV;
sub display
{
print $File::Find::name, -d $_ ? "/ <DIR>
"
: "
";
}
File::Find模块还有一个程序——finddepth,它能保证对象会按照深度的顺序被返回(也就是说,它在返回目录之前会返回目录下的文件)。普通的find程序会以随机的顺序返回找到的对象。
Perl的File::Find模块使得循环访问子目录树下的所有文件变得很容易。