2010-03-01 133 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}; 

換句話說,你會使用時必須取消引用哈希值。