1

1つのディレクトリのサブディレクトリにある特定のXMLファイルを解析しようとしています。何らかの理由で、ファイルが存在しないというエラーが発生します。ファイルが存在しない場合は、次のサブディレクトリに移動する必要があります。

ここに私のコードがあります

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

        my @xmlsearch = map { chomp; $_ } `ls`;

        foreach my $directory (@xmlsearch) {
            print "$directory \n";
            chdir($directory) or die "Couldn't change to [$directory]: $!";
            my  @findResults = `find   -name education.xml`;

         foreach my $educationresults (@findResults){
            print $educationresults;
            my $parser = new XML::Simple;
            my $data = $parser->XMLin($educationresults);
            print Dumper($data);
            chdir('..');         
         }

        }

      ERROR
      music/gitar/education.xml
      File does not exist: ./music/gitar/education.xml
4

2 に答える 2

1

行った方法を使用chdirすると、コードIMOが読みにくくなります。そのためにFile::Findを使用できます:

use autodie;
use File::Find;
use XML::Simple;
use Data::Dumper;

sub findxml {
    my @found;

    opendir(DIR, '.');
    my @where = grep { -d && m#^[^.]+$# } readdir(DIR);
    closedir(DIR);

    File::Find::find({wanted => sub {
        push @found, $File::Find::name if m#^education\.xml$#s && -f _;
    } }, @where);
    return @found;
}

foreach my $xml (findxml()){
    say $xml;
    print Dumper XMLin($xml);
}
于 2012-06-08T15:43:32.350 に答える
0

シェルコマンドを実行するためにバッククォートに依存していることに気付いたときはいつでも、それを実行するための適切なperlの方法があるかどうかを検討する必要があります。この場合、あります。

ls<*>単純なグロブである、に置き換えることができます。この線:

my @array = map { chomp; $_ } `ls`;

ただの回り道です

chomp(my @array = `ls`);  #  chomp takes list arguments as well

しかしもちろん、適切な方法は

my @array = <*>;  # no chomp required

さて、これらすべての簡単な解決策は、単に行うことです

for my $xml (<*/education.xml>) { # find the xml files in dir 1 level up

これは、再帰なしで1レベルのディレクトリをカバーします。完全な再帰には、次を使用しますFile::Find

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

my @list;
find( sub { push @list, $File::Find::name if /^education\.xml$/i; }, ".");

for (@list) {
    # do stuff
    # @list contains full path names of education.xml files found in subdirs
    # e.g. ./music/gitar/education.xml
}

ディレクトリを変更する必要はなく、私の経験では、問題を起こす価値はないことに注意してください。行う代わりに:

chdir($somedir);
my $data = XMLin($somefile);
chdir("..");

単に行う:

my $data = XMLin("$somedir/$somefile");
于 2012-06-08T15:42:31.947 に答える