2016-03-02 55 views
2

現在我需要得到{"teams":[1, 2, 35]},我在下面寫了代碼。數組可以是Perl中的哈希值

use JSON 

my @array; 
@array=(1, 2, 35); 
my %hash; 
$hash{"teams"}[email protected]; 
$json = encode_json(\%hash); 
print $json."\n"; 

但我只是得到{"teams":3}

我的問題是數組可以是Perl中的哈希值嗎?

+1

可能重複的[無法將數組存儲爲散列值](http://stackoverflow.com/questions/23932924/unable-to-store-array-as-a-hash-value)或[我如何將數組作爲值存儲在Perl哈希中?](http:// stackoverflow。com/questions/28480241/how-do-i-store-an-array-as-a-value-in-a-per-hash) –

+0

請將Sobrique answer標記爲正確的! – Mondongo

+0

我認爲Sobrique的答案比無法將數組存儲爲散列值的答案要好,或者如何將數組作爲值存儲在Perl哈希中 –

回答

12

是的,它可以。

perl多維結構是通過引用來完成:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use JSON; 

my @array; 
@array=(1, 2, 35); 
my %hash; 
$hash{"teams"}=\@array; 
my $json = encode_json(\%hash); 
print $json."\n"; 

這種工作方式是 - 你的散列值可以是單個標量值。這應該是對數組的引用。

此打印:

{"teams":[1,2,35]} 

您可以用完成相同的結果:

$hash{"teams"}=[@array]; 

這是類似的,因爲它副本@array到一個匿名數組。

的區別來,如果你再使用@array

#!/usr/bin/env perl 
use strict; 
use warnings; 

use JSON; 

my @array; 
@array=(1, 2, 35); 
my %hash; 
$hash{"teams"}=\@array; 
@array = (3, 4, 5) ; 
$hash{"more"} = \@array; 
my $json = encode_json(\%hash); 
print $json."\n"; 

這實際上打印:

{"teams":[3,4,5],"more":[3,4,5]} 

因爲已經更改了陣列,並使用相同的數組的引用兩次。

但是,如果你這樣做:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use JSON; 

my @array; 
@array=(1, 2, 35); 
my %hash; 
$hash{"teams"}=[@array]; 
@array = (3, 4, 5) ; 
$hash{"more"} = [@array]; 
my $json = encode_json(\%hash); 
print $json."\n"; 

你得到:

{"more":[3,4,5],"teams":[1,2,35]} 

你可以看到發生了什麼事情上相當方便Data::Dumper模塊:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use JSON; 
use Data::Dumper; 

my @array; 
@array = (1, 2, 35); 
my %hash; 
$hash{"teams"} = @array; 
print Dumper \%hash; 

你會看到hash中有什麼是:

$VAR1 = { 
      'teams' => 3 
     }; 
{"teams":3} 

爲什麼你會問?那麼,因爲哈希中的條目可以是只有是一個標量。

所以你正在標量環境中訪問你的數組。並在標量上下文中打印一個數組:

print scalar @array; # prints 3 

這就是你的例子中發生的事情。

+0

您可能希望添加打印輸出以便其他讀者可以看到區別 –