Как мне работать только с одним ключом и значением из вывода Data :: Dumper - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть дампер данных, выводящий удаленно размещенный XML-файл в локальный текстовый файл, и я получаю следующую информацию:

$VAR1 = {
    'resource' => {
        '005cd410-41d6-4e3a-a55f-c38732b73a24.xml' => {
            'standard' => 'DITA',
            'area' => 'holding',
            'id' => 'Comp_UKCLRONLINE_UKCLR_2000UKCLR0278',
        },
        '003c2a5e-4af3-4e70-bf8b-382d0b4edda1.xml' => {
            'standard' => 'DITA',
            'area' => 'holding',
            'id' => 'Comp_UKCLRONLINE_UKCLR_2000UKCLR0278',
        },  

и т. Д.Я хочу работать только с одним ключом и значением в каждом ресурсе.Т.е. выберите идентификатор, а затем создайте URL-адрес из этого.

Я обычно использую регулярное выражение в файле и извлекаю из него нужную мне информацию, но я думаю, что должен быть более простой / правильный способ, ноне могу придумать правильный термин для использования в поиске и поэтому не могу его найти.

Вот код, который я использую для записи этого вывода в файл:

#-----------------------------------------------
sub request_url {
#-----------------------------------------------
my $useragent = LWP::UserAgent->new;
my $request = HTTP::Request->new( GET => "http://digitalessence.net/resource.xml" );
$resource = $useragent->request( $request );                                            
}


#-----------------------------------------------
sub file_write {
#-----------------------------------------------
open OUT, ">$OUT" or Log_message ("\n$DATE - $TIME - Could not create filelist.doc \t");
Log_message ("\n$DATE - $TIME - Opened the output file");
print OUT Dumper (XML::Simple->new()->XMLin( $resource->content ));
Log_message ("\n$DATE - $TIME - Written the output file");
}

спасибо

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Я не совсем понимаю ваш вопрос, но я предполагаю, что вы хотите получить доступ к некоторым данным из хэша.

Вам не нужно регулярное выражение или другие странные вещи;просто `сделайте 'ваши данные и получите значение из hassref, который вы вернете:

Простой однострочник в качестве примера (при условии, что ваш файл называется` dumper.out`):

perl -Mstrict -wE 'my $hashref = do{ do "dumper.out" }; say $hashref->{resource}{"005cd410-41d6-4e3a-a55f-c38732b73a24.xml"}{id}'

HTH, Пол

1 голос
/ 19 сентября 2011

Может быть, вы хотите пройтись по структуре данных, построенной по XML::Simple. Каждый ресурс находится внутри ARRAYREF, который вы получаете, используя ключ resource со структурой данных $doc.

use XML::Simple;
use LWP;
use Data::Dumper;

my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( GET => "http://digitalessence.net/resource.xml" );
my $res = $ua->request( $req );

my $xs         = XML::Simple->new();
my $doc        = $xs->XMLin( $res->content );

printf "resources: %s\n", scalar keys %{ $doc->{ resource } };

foreach ( keys %{ $doc->{ resource } } ) {
    printf "resource => %s, id => %s\n", $_, $doc->{ resource }->{ $_ }->{ id };
}

Вывод такой:

resources: 7
resource => 005cd410-41d6-4e3a-a55f-c38732b73a24.xml, id => Comp_UKCLRONLINE_UKCLR_2000UKCLR0278
resource => 003c2a5e-4af3-4e70-bf8b-382d0b4edda1.xml, id => Comp_UKCLRONLINE_UKCLR_2002UKCLR0059
resource => 0033d4d3-c397-471f-8cf5-16fb588b0951.xml, id => Comp_UKCLRONLINE_UKCLR_navParentTopic_67
resource => 002a770a-db47-41ef-a8bb-0c8aa45a8de5.xml, id => Comp_UKCLRONLINE_UKCLR_navParentTopic_308
resource => 000fff79-45b8-4ac3-8a57-def971790f16.xml, id => Comp_UKCLRONLINE_UKCLR_2002UKCLR0502
resource => 00493372-c090-4734-9a50-8f5a06489591.xml, id => Comp_UKCLRONLINE_COMPCS_2010_10_0002
resource => 004377bf-8e24-4a69-9411-7c6baca80b87.xml, id => Comp_CLJONLINE_CLJ_2002_01_11
...