我有以下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
循环中需要循环遍历每个数组。我是对的吗?
答案 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) ) {
....