<分区>
现在我需要获取 {"teams":[1, 2, 35]}
,我写了下面的代码。
use JSON
my @array;
@array=(1, 2, 35);
my %hash;
$hash{"teams"}=@array;
$json = encode_json(\%hash);
print $json."\n";
但我只得到 {"teams":3}
。
我的问题是数组可以是 Perl 中哈希的值吗?
<分区>
现在我需要获取 {"teams":[1, 2, 35]}
,我写了下面的代码。
use JSON
my @array;
@array=(1, 2, 35);
my %hash;
$hash{"teams"}=@array;
$json = encode_json(\%hash);
print $json."\n";
但我只得到 {"teams":3}
。
我的问题是数组可以是 Perl 中哈希的值吗?
最佳答案
是的,它可以。
在 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
这就是您的示例中发生的情况。
关于arrays - 数组可以是Perl中哈希的值吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35745176/