2010-03-01 89 views
5

如何访问数据我有这样的代码:于存储在哈希

$coder = JSON::XS->new->utf8->pretty->allow_nonref; 
%perl = $coder->decode ($json); 

当我写print %perl变量,它说HASH(0x9e04db0)。我如何访问这个HASH中的数据?

回答

5

decode的返回值不是散列,你不应该将它分配给%hash - 当你这样做时,你会破坏它的值。这是一个散列参考并应分配给标量。阅读perlreftut

+0

好的,我发现打印键%{$ perl}让我从哈希键,但打印值%{$ perl}让我另一个哈希引用。所以我将这个引用存储在新的标量变量中,但是当我尝试访问这个Hash中的数据时,它什么也不给我。 $ json ='{“glossary”:{“title”:“example glossary”,“GlossDiv”:{“title”:“S”}}}'; $ coder = JSON :: XS-> new-> utf8-> pretty-> allow_nonref; $ perl = $ coder-> decode($ json); 打印键%{$ perl},“\ n”; #give me词汇表 打印值%{$ perl},“\ n”; #give me HASH(地址) my $ val = values%{$ perl}; #商店地址 打印键%{$ val}; ##什么也不给 - 标题预期 – 2010-03-02 12:08:25

-3

很多方法,你可以使用一个foreach loop

foreach my $key (%perl) 
{ 
    print "$key is $perl{$key}\n"; 
} 

while loop

while (my ($key, $value) = each %perl) 
{ 
    print "$key is $perl{$key}\n"; 
} 
-3

您仅需要指定哈希的特定键,然后你将能够从哈希中访问数据。

例如,如果%perl hash具有名为'file'的键;

你想访问类似下面

打印$ {perl的 '文件'}; #这将打印%Perl中的哈希的文件密钥值

13

由于decode方法的实际返回参考哈希,分配的正确方法应该是:

%perl = %{ $coder->decode ($json) }; 

也就是说,要从哈希中获取数据,您可以使用each内建函数或循环遍历其键,并通过下标获取值。

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

for my $key (keys %perl) { 
    print "$key = $perl{$key}\n"; 
} 
7

JSON :: XS-> decode返回对数组或散列的引用。做你正在尝试做的,你就必须做到这一点:

$coder = JSON::XS->new->utf8->pretty->allow_nonref; 
$perl = $coder->decode ($json); 

print %{$perl}; 

换句话说,你会使用时必须取消引用哈希值。