0

ディレクトリとそのサブディレクトリを走査し、すべての XML ファイルを取得して解析するスクリプトを作成したいと考えています。で困っていchdirます。これはうまくいきます:

my $search = "/home/user/books";
chdir($search) or die "cant change dir to $search $!";
system("ls");

しかし、ユーザーに検索したいパスを決定してもらいたいので、次を使用していますGetopt::Long

use strict;
use warnings;
use Data::Dumper;
use XML::Simple;
use Getopt::Long;

my $outputFile = '';
my $searchPath = "";
my $debug      = 0;
GetOptions('outputFile=s' => \$outputFile, 'searchPath=s' => \$searchPath);
if ($outputFile eq '' or $searchPath = '') {
    die("parameter --outpulFile=s is required.");
}
$searchPath =~ s/\/*$/\//;
my @founddirs = `cd $searchPath`;
foreach my $foundfiles (@founddirs) {
    print $foundfiles;
    chdir($foundfiles) or die "cant change dir to $searchPath $!";
    chdir('..');
}

実行するコマンド:

perl sample.pl --outputFile=books.txt --searchPath=/home/user/june18

サブディレクトリからすべての recursive.xml ファイルを取得して解析したいと考えています。これを行う方法を知っている人はいますか?

4

2 に答える 2

1

ここにいくつかの問題があります:

  • $searchPath = ''入力の検証中に検索パスを空の文字列に設定しています。eq代わりに使用する (ではない==)
  • @founddirsバックティック演算子は何も返さないため、何も含まれません。それの訳は

    my @founddirs = `cd $searchPath`;
    

    改行で区切られた見つかったディレクトリを出力しません。おそらく、あなたは後にしていますls $searchPath

File::Findちなみに、代わりに使用してみませんか?

use strict;
use warnings;

use File::Find;
use Getopt::Long;

my $outputFile;
my $searchPath;

GetOptions(
            'outputFile=s' => \$outputFile,
            'searchPath=s' => \$searchPath,
          );

die "Usage : perl sample.pl -outputFile -searchPath\n"
  unless $outputFile && $searchPath;

die "No such directory found: $searchPath\n" unless -d $searchPath;

find( sub { print "$File::Find::name\n" if /$outputFile/ }, $searchPath );
于 2012-06-14T20:03:07.190 に答える
1
#!/usr/bin/perl --
use strict; use warnings;
use Data::Dump qw/ dd /;
use File::Find::Rule qw/ find /;
my @files = find(
    file =>
    name => '*.xml',
    in => \@ARGV
);

dd \@files;

__END__
$ perl ffrule
[]

$ perl ffrule ../soap
[
 "../soap/ex1.xml",
 "../soap/ex2.xml",
 "../soap/ex3.xml",
]
于 2012-06-15T06:28:52.547 に答える