我正在编写一个脚本,该脚本遍历我们的Perl Scripts大目录并检查某些内容。现在,它需要两种输入:主目录或单个文件。如果提供单个文件,它将在该文件上运行main函数。如果提供了主目录,它会在该目录中的每个.pm和.pl上运行main函数(由于目录遍历的递归性质)。
我如何编写它(或者什么包可能有用) - 这样我也可以输入七个SUBdirectories中的一个,它只会遍历那个子目录(而不是整个东西)?
答案 0 :(得分:2)
我无法真正看到两个目录参数之间的处理差异。当然,使用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);
}
答案 1 :(得分:1)
如果您确切知道要查看的目录和子目录,可以使用glob("$dir/*/*/*.txt")
来获取给定.txt
的第3级中的$dir
个文件
答案 2 :(得分:1)
一种方便的方法是使用优秀的Path::Class
module,更精确地使用Path::Class::Dir
的traverse()
方法。您将在回调函数中控制要处理的内容,该函数作为traverse()
的第一个参数提供。联机帮助页有样本片段。
当然,使用像opendir
这样的内置函数非常好。
我刚刚转向使用Path::Class
几乎无处不在,因为它有很多不错的便利方法,而且感觉很对。请务必阅读docs for Path::Class::File
以了解可用的内容。 99%的时间都可以胜任这项工作。