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