Как читать данные из хэша в Perl? - PullRequest
1 голос
/ 03 октября 2011

У меня есть следующий XML-файл:

<?xml version='1.0'?>
<preferences>
    <font role="console">
        <fname>Courier</fname>
        <size>9</size>
    </font>
    <font role="default">
        <fname>Times New Roman</fname>
        <size>14</size>
    </font>
    <font role="titles">
        <fname>Helvetica</fname>
        <size>10</size>
    </font>
</preferences>

Мне удалось прочитать и выбросить. Теперь я должен прочитать все пары ключ-значение.

Вот скрипт:

#!/usr/bin/perl

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

my $data = XMLin('test.xml');

# print Dumper(%data);


while ( my ($key, $value) = each(%$data) ) {
    print "$key => $value\n";
}

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

Это прекрасно работает:

my $data = XMLin('test.xml');
print Dumper($data);

И это дает мне:

$VAR1 = {
          'font' => [
                    {
                      'fname' => 'Courier',
                      'role' => 'console',
                      'size' => '9'
                    },
                    {
                      'fname' => 'Times New Roman',
                      'role' => 'default',
                      'size' => '14'
                    },
                    {
                      'fname' => 'Helvetica',
                      'role' => 'titles',
                      'size' => '10'
                    }
                  ]
        };

Я предполагаю, что внутри цикла while мне нужно перебрать все массивы. Я прав?

Ответы [ 2 ]

7 голосов
/ 03 октября 2011
use strict;

Ваш друг. Он сказал бы вам:

Global symbol "%data" requires explicit package name

То, что вы хотите, это %$data

Другими словами: $data и %data считаются двумя разными переменными.

Обновление:

Поскольку вы изменили весь вопрос, мой ответ теперь не имеет большого смысла .. Как и ваш вопрос. Вы распечатали это. Что еще тебе нужно?

Если вы хотите напечатать эту структуру, вам нужно что-то вроде (не проверено):

for my $key1 (keys %$data) {
    for my $array_value (@{ $data->{$key1} }) {
        for my $key2 (keys %$array_value) {
            print "$key2 => $array_value->{$key2}\n";
        }
    }
}

Если вы хотите получить прямой доступ к значению:

print $data->{font}[0]{'fname'}

Вам нужно будет поэкспериментировать, чтобы получить то, что вам нужно. В выводе Data :: Dumper вы можете легко увидеть, какие значения являются хешами, а какие - массивами:

$VAR1 = {   # The curly bracket denotes a beginning hash 
          'font' => [     # Square bracket = array begins
                    {     # The first array element is a hash 
                      'fname' => 'Courier',   # Inside the hash
                      'role' => 'console',
                      'size' => '9'
                    },    # Hash ends
                    {     # Next array value, new hash begins
                      'fname' => 'Times New Roman',
                      'role' => 'default',
                      'size' => '14'
                    },
                    {
                      'fname' => 'Helvetica',
                      'role' => 'titles',
                      'size' => '10'
                    }
                  ]     # Array ends
        }; # Hash ends
2 голосов
/ 03 октября 2011

Попробуйте с:

 while ( my ($key, $value) = each(%$data) ) {      
   ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...