невозможно распечатать правильное значение ключа хеша с помощью простого модуля xml - PullRequest
0 голосов
/ 04 октября 2011

Я тестировал использование XML :: Simple с perl. Я могу распечатать некоторые данные, но не могу распечатать имя файла и размер байта в моем образце. Может кто-нибудь показать мне, как извлечь следующую информацию из этого XML-файла?

Хотелось бы получить:

  • каталог файлов: /storage/foobar/test/queues/20110731
  • имя файла: myfilename-00
  • размер файла: 1234567891

Пока я могу получить каталог файлов, но имя файла дает мне хэш-значение, а получение размера файла не работает.

Вот код на данный момент:

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

my $xml = $ARGV [0]; 
for my $xs ($xml) {
    #my $data = XMLin($xs, ForceArray => 0);
    my $data = XMLin($xs, ForceArray => 1);
    #my $data = XMLin($xs, ForceArray => [ qw (directory file path ) ]);
    print Dumper ($data);
    print "This is the DIRECTORY: $data->{path}\n"; 
    print "This is the FILE:      $data->{file}\n";
    print "This is the FILE SIZE: $data->{size}\n";
}

Результат:

This is the DIRECTORY: /storage/foobar/test/queues/20110731
This is the FILE:      ARRAY(0x8265c38)
Use of uninitialized value in concatenation (.) or string 
This is the FILE SIZE: 

Хранитель:

образец xml:

<?xml version="1.0" encoding="UTF-8"?>
<listing time="2011-10-04T02:33:44+0000" recursive="no" path="/storage/foobar/test/queues/20110731" exclude="" filter=".*" version="0.20.202.1.1101050227">
    <directory path="/storage/foobar/test/queues/20110731" modified="2011-10-04T02:32:11+0000" accesstime="1970-01-01T00:00:00+0000" permission="drwx------" owner="unix_act" group="foobar"/>
    <file path="/storage/foobar/test/queues/20110731/myfilename-00" modified="2011-10-03T04:47:46+0000" accesstime="2011-10-03T04:47:46+0000" size="123456789" app="3" blocksize="134217728" permission="-rw-------" owner="unix_act" group="foobar"/>
    <file path="/storage/foobar/test/queues/20110731/myfilename-01" modified="2011-10-03T04:48:04+0000" accesstime="2011-10-03T04:48:04+0000" size="987654321" app="3" blocksize="134217728" permission="-rw-------" owner="unix_act" group="foobar"/>
</listing>

Ответы [ 2 ]

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

Запись file будет соответствовать тегу eahc <file...> в вашем XML. Таким образом, вам действительно нужна какая-то петля. Помните, что $data эффективно указывает на ваш <listing...> тег

Я не проверял это, но это суть того, что вы хотите

foreach my $file( @{ $data->{file} } )
{
    my( $dir, $fname );
    if( $file->{path} =~ /^(.*)\/([^\/]+)$/ )
    {
        $dir = $1;
        $fname = $2;
    }
    else 
    {
        $dir = "";
        $fname = $file->{path};
    }
    print "This is the DIRECTORY: $dir\n"; 
    print "This is the FILE:      $fname\n";
    print "This is the FILE SIZE: $file->{size}\n";
}

Редактировать: Я немного смущен вашим выводом. С forcearray => 1 я бы ожидал, что $data->{file} будет arrayref, а не hashref

0 голосов
/ 04 октября 2011

Очевидно, и едва ли неожиданно, $data->{file} является ссылкой на структуру, содержащую все атрибуты файла.Попробуйте $data->{file}->{path} для имени файла и ->{size} для размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...