0

簡単なメモ: 私はかなりの数日間この問題に悩まされてきました。必ずしも答えを見つけることを望んでいるわけではありませんが、私を「啓発」する可能性のあるあらゆる種類の助けを求めています. また、私は Perl の初心者であるため、知識はそれほど多くなく、この場合、再帰性は得意ではありません。ここに行きます:

Perl スクリプトで実行したいことは次のとおりです。

  • ディレクトリを引数に取る
  • 渡されたディレクトリとそのサブディレクトリに移動して、*.xml ファイルを見つけます
  • 見つかった *.xml ファイルのフル パスを配列に格納します。

以下は私がこれまでに持っているコードですが、私はそれを機能させることができませんでした:

#! /usr/bin/perl -W

my $path;
process_files ($path);

sub process_files
{
    opendir (DIR, $path) or die "Unable to open $path: $!";

    my @files =
        # Third: Prepend the full path
        map { $path . '/' . $_ }
        # Second: take out '.' and '..'
        grep { !/^\.{1,2}$/ }
        # First: get all files
        readdir (DIR);

    closedir (DIR);

    for (@files)
    {
          if (-d $_)
          {            
            push @files, process_files ($_);
          }
          else
          {
             #analyse document
          }
    }
    return @files;
}

誰かが私を正しい方向に向ける手がかりを持っていますか? それとももっと簡単な方法ですか?

ありがとう、sSmacKk :D

4

1 に答える 1

4

を使用する必要があるようですFile::Find。そのfindサブルーチンは、ディレクトリを再帰的にトラバースします。

use strict;
use warnings;
use File::Find;

my @files;
my $path = shift;
find(
    sub { (-f && /\.xml$/i) or return; 
           push @files, $File::Find::name; 
    }, $path);

サブルーチンは、見つかったファイルに含まれるコードを実行します。これは、XML ファイル名 (フル パスを含む) を@files配列にプッシュするだけです。詳細については、perl 5 のコア モジュールであるモジュールのドキュメントを参照してください。File::Find

于 2012-12-27T15:00:11.353 に答える