arrays - 数组可以是Perl中哈希的值吗

标签 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";

但我只得到 {"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/

相关文章:

Perl HTTP::Request Put -> 方法不允许

ruby-on-rails - 使用 Oj.dump 序列化时将符号转换为字符串

c# - 是否可以使用具有一系列值的哈希表?

javascript - 如何从多维数组中获取最小值?

javascript - 安全地检查多维数组中的元素是否在 JavaScript 中未定义?

perl - 是什么决定了 Devel::Peek 的 LEN 值

java - 在 Java 中使用哈希值对数组进行排序

arrays - Lisp 为什么我的对象是同一个实例?

javascript - 将数组拆分为多个页面索引

linux - ImageMagick/Perl 按像素宽度/高度对图像进行排序