可以在Perl中使用数组作为Hash的值

joh*_*hao 2 arrays perl hash

现在我需要得到{"teams":[1, 2, 35]},我写下面的代码.

use JSON

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

但我得到了{"teams":3}.

我的问题是可以在Perl中使用Hash的值吗?

Sob*_*que 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";
Run Code Online (Sandbox Code Playgroud)

这种方式的工作方式是 - 您的哈希值只能是单个标量值.这应该是对数组的引用.

这打印:

{"teams":[1,2,35]}
Run Code Online (Sandbox Code Playgroud)

你可以用以下方法完成相同的结果:

$hash{"teams"}=[@array];
Run Code Online (Sandbox Code Playgroud)

这是类似的,因为它复制 @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";
Run Code Online (Sandbox Code Playgroud)

这将实际打印:

{"teams":[3,4,5],"more":[3,4,5]}
Run Code Online (Sandbox Code Playgroud)

因为您已经更改了数组,并且使用了对同一数组的引用两次.

但如果你这样做:

#!/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";
Run Code Online (Sandbox Code Playgroud)

你得到:

{"more":[3,4,5],"teams":[1,2,35]}
Run Code Online (Sandbox Code Playgroud)

您可以看到相当方便的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;
Run Code Online (Sandbox Code Playgroud)

你会看到它的内容hash是:

$VAR1 = {
          'teams' => 3
        };
{"teams":3}
Run Code Online (Sandbox Code Playgroud)

你可能会问为什么?好吧,因为哈希中的条目只能是标量.

所以你在标量上下文中访问你的数组.并且在标量上下文中的数组打印它的元素数量:

print scalar @array; # prints 3
Run Code Online (Sandbox Code Playgroud)

这是你的例子中发生的事情.