如何在Perl中从散列读取数据?
我有以下XML文件:如何在Perl中从散列读取数据?,perl,Perl,我有以下XML文件: <?xml version='1.0'?> <preferences> <font role="console"> <fname>Courier</fname> <size>9</size> </font> <font role="default"> <fname>Times New
<?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>
循环中没有打印任何内容。。。有什么问题吗?我是新手,在同一天编写了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 ( my ($key, $value) = each(%$data) ) {
....
尝试:
while ( my ($key, $value) = each(%$data) ) {
....
他是你的朋友。它会告诉你:
Global symbol "%data" requires explicit package name
您需要的是%$data
换句话说:$data
和%data
算作两个不同的变量
更新:
由于你改变了整个问题,我的回答现在毫无意义。。你的问题也是。你已经印好了。你还需要什么
如果您想打印该结构,您需要(未经测试):
如果要直接访问值,请执行以下操作:
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
他是你的朋友。它会告诉你:
Global symbol "%data" requires explicit package name
您需要的是%$data
换句话说:$data
和%data
算作两个不同的变量
更新:
由于你改变了整个问题,我的回答现在毫无意义。。你的问题也是。你已经印好了。你还需要什么
如果您想打印该结构,您需要(未经测试):
如果要直接访问值,请执行以下操作:
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
算我是白痴,解释一下你指的是什么?首先,养成习惯,不要在所有代码中包含使用strict
。在这种情况下(在您将声明$data=…
的行更改为my$data=…
)之后,它会抱怨您没有声明%data
——这将帮助您立即找到正确的方向。:-)你想完成什么?$data
是一个标量引用,而不是散列,而且由于$
符号,它不能成为一个。@ash我相信你不会被踢出。在主散列中只有一个键值对。该值是对数组的引用。数组包含一个哈希列表。呸!你可以通过{
或[
查看它是数组还是散列。把我算为白痴并解释你指的是什么?对于初学者,养成习惯,不要在所有代码中包含使用strict
。在这种情况下(将声明$data=…
的行更改为my$data=…
),它会抱怨您没有声明%data
——这将立即为您指明正确的方向。:-)您试图完成的是什么?$data
是一个标量引用,而不是散列,并且它不可能是一个,因为$
符号。@ash我确信您不会被踢出。您拥有的是主哈希中只有一个键值对。该值是对数组的引用。数组包含哈希列表。呸!如果是数组或哈希,可以通过{
或[
查看。