1

我正在编写一个脚本,它会遍历我们的 Perl 脚本大目录并检查某些内容。现在,它需要两种输入:主目录或单个文件。如果提供了单个文件,它将在该文件上运行 main 函数。如果提供了主目录,它将在该目录内的每个 .pm 和 .pl 上运行 main 函数(由于目录遍历的递归性质)。

我该如何编写它(或者什么包可能会有所帮助) - 这样我也可以输入七个子目录之一,它只会遍历那个子目录(而不是整个东西)?

4

3 回答 3

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);
}
于 2012-05-16T08:34:19.893 回答
1

如果您确切知道要查看的目录和子目录,则可以使用glob("$dir/*/*/*.txt")例如.txt在给定的第 3 级获取文件$dir

于 2012-05-15T19:49:57.593 回答
1

一种方便的方法是使用优秀的Path::Class模块,更准确地说:traverse()方法Path::Class::Dir。您可以在作为第一个参数提供的回调函数中控制要处理的内容traverse()。手册页有示例片段。

当然,使用内置的 likeopendir是非常好的。

不过,我刚刚转向Path::Class几乎在任何地方都使用它,因为它有很多不错的便捷方法,而且感觉很不错。请务必阅读文档Path::Class::File以了解可用的内容。真正做到了 99% 的时间。

于 2012-05-16T08:47:51.707 回答