我正在编写一个脚本,通过我们庞大的Perl脚本目录并检查某些事情。现在,它需要两种输入:主目录或单个文件。如果提供了单个文件,它将在该文件上运行主要功能。如果提供主目录,它将在该目录内的每个.pm和.pl上运行主函数(由于目录遍历的递归性质)。Perl子目录遍历
我该如何编写它(或者什么软件包可能会有所帮助) - 以便我还可以输入七个子目录中的一个,它只会遍历该子目录(而不是整个目录)?
我正在编写一个脚本,通过我们庞大的Perl脚本目录并检查某些事情。现在,它需要两种输入:主目录或单个文件。如果提供了单个文件,它将在该文件上运行主要功能。如果提供主目录,它将在该目录内的每个.pm和.pl上运行主函数(由于目录遍历的递归性质)。Perl子目录遍历
我该如何编写它(或者什么软件包可能会有所帮助) - 以便我还可以输入七个子目录中的一个,它只会遍历该子目录(而不是整个目录)?
一种方便的方法是使用优秀的Path::Class
module,更准确地说的Path::Class::Dir
的traverse()
方法。你可以控制从作为第一个参数提供的回调函数中处理的内容到traverse()
。手册页有样本片段。
当然,使用像opendir
这样的内置插件是非常好的。
我刚刚转向使用Path::Class
几乎无处不在,因为它有许多不错的便利方法,只是感觉很好。请务必阅读docs for Path::Class::File
以了解可用内容。真的99%的时间完成这项工作。
如果你确切地知道你想看看你可以使用glob("$dir/*/*/*.txt")
例如获得过.txt
文件中给出的$dir
的第三级我实在看不出之间的处理有什么区别目录及子目录两个目录参数。当然,使用File :: Find只会在两种情况下做正确的事情。
事情是这样的......
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
my $input = shift;
if (-f $input) {
# Handle a single file
handle_a_file($input);
} else {
# Handler a directory
handle_a_directory($input);
}
sub handle_a_file {
my $file = shift;
# Do whatever you need to with a single file
}
sub handle_a_directory {
my $dir = shift;
find(\&do this, $dir);
}
sub do_this {
return unless -f;
return unless /\.p[ml]$/;
handle_a_file($File::Find::name);
}
那么'opendir'和'readdir'和'grep'为所需的目录呢? – smocking