【问题标题】:How to push an array into another array?如何将一个数组推入另一个数组?
【发布时间】:2022-01-03 09:26:18
【问题描述】:

我们如何正确地将数组推入数组,然后检索每个外部数组(解释一下两者都要求彼此清楚地分开)?

图解

my @f; my @e;
for $i (0..40) {
    @e=($i+=2, $i+1);
    push(@f,@e); # just it right ? 
}
    
# how go on get it under multi array control

【问题讨论】:

  • 您能否发布一个示例,说明最终数组在伪代码中的样子。

标签: perl multidimensional-array


【解决方案1】:

Data::Dumper 是探索这里发生的事情的好工具。它使您的数据结构可视化变得容易。

如果我们运行您的代码,然后使用 Data::Dumper 显示 @f,我们会得到:

$VAR1 = [
          2,
          3,
          3,
          4,
          4,
          5,
          5,
          6,
          6,
[ ... snip ... ]
          40,
          40,
          41,
          41,
          42,
          42,
          43
        ];

所以这不是你想要的。如果你将一个数组压入另一个数组,那么 Perl 只会将第二个数组中的每个元素添加到第一个数组的末尾。无法分辨哪个元素属于哪个数组。这称为“数组展平”。

这是因为数组中的元素只能保存一个标量值。另一个数组不是标量值。但是我们可以将一个reference指向一个数组,然后它就是一个标量值。您可以使用 \ 获得对数组的引用。

对代码的更改很简单:

my @e=($i+=2, $i+1); # declare @e inside the loop
push(@f,\@e); # Take a reference

我们现在得到的输出是:

$VAR1 = [
          [
            2,
            3
          ],
          [
            3,
            4
          ],
          [
            4,
            5
          ],
[ ... snip ... ]
          [
            39,
            40
          ],
          [
            40,
            41
          ],
          [
            41,
            42
          ],
          [
            42,
            43
          ]
        ];

您可以清楚地看到主数组中的各个“子数组”。

perllol 手册页中对此进行了详细介绍,您可以在 perlreftut 和 perlref 中找到有关参考的更多信息。

【讨论】:

  • 很酷的解释。如果我曾经需要存储数组,那么我会使用哈希而不是数组来存储数组。
  • @SamB:但这会给您带来完全相同的问题。数组中的元素和散列中的值都只能是标量值 - 因此您需要创建引用才能在其中存储数组或散列。
【解决方案2】:

你的意思是这样的吗?

#! /usr/bin/env perl

use warnings;
use strict;
use utf8;
use feature qw<say>;
use Data::Dumper;

my @f = ();

for my $i (0..4) {
    my @e = ($i+=2, $i+1);
    push(@f,\@e);
}

say Dumper(\@f);

exit(0);

【讨论】:

  • 解释:数组元素是标量,所以数组不能放在数组中。但是可以引用一个。
猜你喜欢
  • 2015-07-26
  • 1970-01-01
  • 2013-01-14
  • 2017-09-26
  • 1970-01-01
  • 2020-02-08
  • 2019-05-10
相关资源
最近更新 更多