perl脚本搜索文件夹中的所有文件

时间:2011-10-14 13:14:59

标签: perl

我有一个包含更多xml文件的文件夹,并从xml文件中提取一些特定信息。我使用libxml一个xml提取想要的信息,但我成功但现在如何使用perl脚本从文件夹和每个xml文件中提取。我试过一个xml文件:

use warnings;
use strict;
use XML::LibXML::Reader;

my $file;
open( $file, 'formal.xml');
my $reader = XML::LibXML::Reader->new( IO => $file ) 
    or die ("unable to open file");
my %hash;
while ($reader->nextElement( 'nuber' ) ) {
    my $Number = $reader->readInnerXml();
    $reader->nextElement( 'data' ); 
    my $information = $reader->readOuterXml(); 
    $nums{$Number}= $information;
    print( "  NUMBER:$Number\n" );
    print( " Information:$information\n" );
}
print my $num=keys%hash;
close($file);

以上代码正常工作并提取我想要的内容。现在我需要脚本来搜索文件夹中的所有文件,并从所有文件中提取相同的信息。

1 个答案:

答案 0 :(得分:3)

使用File::Find

您的代码无法正常工作。这是一个未经测试的脚本,可能会做你想要的。

use warnings; use strict;

use Carp;
use File::Find;
use File::Spec::Functions qw( canonpath );
use XML::LibXML::Reader;

die "Need directories\n" unless @ARGV;

my %hash;
find(
    sub {
        my $file = $_;
        my $path = canonpath $File::Find::name;

        return unless -f $path;
        return unless $file =~ /[.]xml\z/i;

        extract_information($path, \%hash);
        return;
    },
    @ARGV
);

use Data::Dumper;
print Dumper \%hash;

sub extract_information {
    my ($path, $hash) = @_;

    my $ret = open my $xmlin, '<', $path;
    unless ($ret) {
        carp "Cannot open '$path': $!";
        return;
    }

    my $reader = XML::LibXML::Reader->new(IO => $xmlin);
    unless ($reader) {
        carp "Cannot create reader using '$path'";
        return;
    }

    while ($reader->nextElement('number')) {
        my $Number = $reader->readInnerXml();

        $reader->nextElement( 'data' );
        my $information = $reader->readOuterXml();

        $hash->{$path}{$Number} = $information;
    }

    close $xmlin
        or carp "Cannot close '$path': $!";

    return;
}