Perl скрипт для поиска всех файлов в папке - PullRequest
0 голосов
/ 14 октября 2011

У меня есть одна папка, которая содержит большее количество XML-файлов и извлекает некоторую конкретную информацию из XML-файлов.Я использовал libxml для извлечения нужной информации в один xml, и у меня получилось, но теперь как мне извлечь из папки и из каждого xml-файла скрипт perlЯ попробовал вот так для одного 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 Ответ

3 голосов
/ 14 октября 2011

использовать Файл :: Найти .

Ваш код не может работать должным образом.Вот непроверенный скрипт, который может делать то, что вы хотите.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...