【问题标题】:Perl Subdirectory TraversalPerl 子目录遍历
【发布时间】:2012-05-15 19:45:50
【问题描述】:

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

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

【问题讨论】:

  • 只需要opendirreaddirgrep 来获取所需目录呢?

标签: perl directory traversal


【解决方案1】:

我看不出两个目录参数在处理上的区别。当然,使用 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);
}

【讨论】:

    【解决方案2】:

    一种方便的方法是使用出色的Path::Class module,更准确地说:Path::Class::Dirtraverse() 方法。您可以在作为traverse() 的第一个参数提供的回调函数中控制要处理的内容。手册页有示例 sn-ps。

    当然,使用像 opendir 这样的内置插件是完全可以的。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 2016-07-24
        相关资源
        最近更新 更多