如何从Perl中的哈希读取数据?

时间:2011-10-03 15:52:23

标签: perl

我有以下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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

尝试:

 while ( my ($key, $value) = each(%$data) ) {      
   ....