Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中从散列读取数据?_Perl - Fatal编程技术网

如何在Perl中从散列读取数据?

如何在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文件:

<?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我确信您不会被踢出。您拥有的是主哈希中只有一个键值对。该值是对数组的引用。数组包含哈希列表。呸!如果是数组或哈希,可以通过
{
[
查看。