【问题标题】:joining two arrays within a nested hash在嵌套哈希中连接两个数组
【发布时间】:2019-12-04 06:20:31
【问题描述】:

我正在运行一个脚本,该脚本计算数据库查询的内容并将结果以散列形式返回以进行更多处理。 不幸的是,似乎正在发生的事情是数组填满了数组,而不是它们被连接在一起。

我不确定这里发生了什么,就像我从 while 循环中删除它并只是手动定义要推送的数组时一样,它们都按预期被推送到我的密钥下的一个数组中。

while ( my $data = $query->fetchrow_hashref ) {
    my $value     = decode_json $data->{value};
    my @array = $value->{array};
    my %hash;
    my $person = "Scott";
    push @{$hash{$person}->{"arrays"}}, @array;
}

Dumper 导致以下结果:

      'scott' => {
                    'arrays' => [
                                [
                                  'stuff1', 'stuff2'
                                ],
                                [
                                  'stuff3','stuff4'
                                ],
                               ]
                   }

我希望该数组不会成为其他数组的嵌套,而只是一个包含 stuff\d 值的数组

【问题讨论】:

  • 试试my @array = @{ $value->{array} }而不是my @array = $value->{array}
  • 哇,非常感谢。我并不惊讶它是如此简单,但我还是有点迷失在这里。我猜想包装我认为是数组的东西实际上不是,它会改变上下文?
  • 不客气!问题是$value->{array} 是一个数组引用。如果它被分配给@array,它变成一个长度为1的数组,其中第一个(也是唯一的)元素是对$value->{array}的引用。但是,如果您将@ 放在数组引用的前面,它会将其解压缩为一个真正的数组(而不是对数组的引用)。请参阅perldscperlref 了解更多信息。

标签: arrays perl reference push


【解决方案1】:
my $value     = decode_json $data->{value};

在这里,您将 JSON 解码为 Perl 数据结构。它是一个引用(我们可以从它存储在标量变量中的事实看出),但我们还不确定它是什么类型的引用。

my @array = $value->{array};

好的,这里我们得到了关于引用类型的线索。我猜你希望它是一个数组引用,因为你试图存储在一个数组中。但是您只是将引用存储在数组中。如果您此时查看数组,它将包含一个值类似于ARRAY(0x99999999) 的元素。这相当于做:

my @array = [ 'list', 'of', 'values' ];

或者

my @array = \@some_other_array;

我认为你真正想要的是:

my @array = @{ $value->{array} };

这会尊重数组引用并将引用数组中的实际元素存储在新数组中。这相当于:

my @array = ( 'list', 'of', 'values' );

或者:

my @array = @some_other_array;

我希望区别很明显。

【讨论】:

  • 非常感谢 Dave 的深入解释!
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2014-05-31
  • 2014-03-02
  • 2012-08-02
  • 1970-01-01
相关资源
最近更新 更多