1

私はPerlスクリプトの大きなディレクトリを調べて特定のことをチェックするスクリプトを書いています。現在、メインディレクトリと単一ファイルの2種類の入力が必要です。単一のファイルが提供されている場合、そのファイルに対してmain関数が実行されます。メインディレクトリが提供されている場合、そのディレクトリ内のすべての.pmおよび.plでmain関数が実行されます(ディレクトリトラバーサルの再帰的な性質のため)。

どうすればそれを書くことができますか(またはどのパッケージが役立つかもしれません)-7つのサブディレクトリの1つにも入ることができ、(全体ではなく)そのサブディレクトリのみをトラバースしますか?

4

3 に答える 3

2

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

便利な方法の1つは、優れたPath::Classモジュールを使用することです。より正確には、のtraverse()方法ですPath::Class::Dir。への最初の引数として提供されるコールバック関数内から何を処理するかを制御しますtraverse()。マンページにはサンプルスニペットがあります。

もちろん、ビルトインのようなものを使用することopendirはまったく問題ありません。

Path::Classただし、便利な方法がたくさんあり、単純に正しいと感じるため、ほとんどすべての場所で使用するようになりました。何が利用できるかを知るために、必ずドキュメントPath::Class::Fileを読んでください。本当に99%の時間仕事をします。

于 2012-05-16T08:47:51.707 に答える