如何在Perl中初始化一个二维数组?

8

我该如何在Perl中初始化一个二维数组?

我正在尝试以下代码:

 0 use strict;
10 my @frame_events = (((1) x 10), ((1) x 10));
20 print "$frame_events[1][1]\n";

但是它会出现以下错误:

在./dyn_pf.pl的第20行使用“strict refs”时无法使用字符串“1”作为数组引用。

这个语法只能初始化一个一维数组,因为print "$frame_events[1]\n"是可用的。尽管在赋值过程中Perl不会出现任何错误。
4个回答

16

在Perl中,你不能拥有一个数组的数组,只能拥有一个数组的引用。

my @frame_events = ([(1) x 10], [(1) x 10]);
print "$frame_events[1]->[1]\n";

特殊情况:你可以在相邻的方括号(无论是方括号还是花括号)之间省略指针解引用箭头:

print "$frame_events[1][1]\n";

一般情况下,你不能够拥有:

  • 数组的数组(的数组……)
  • 数组的哈希(的……)
  • 哈希的数组
  • 哈希的哈希。

但是,你可以拥有:

  • 数组的参考到数组(的参考到数组……)
  • 数组的参考到哈希(的参考到……)
  • 哈希的参考到数组
  • 哈希的参考到哈希

此外,你还可以拥有:

  • 标量的数组
  • 标量的数组的参考
  • 标量的数组的参考的数组的参考
  • 标量的哈希的参考的数组的参考
  • 等等。

3
请注意,这并不阻止人们在日常交流中说“哈希的哈希”,“数组的哈希”等,因为我们都知道哈希表或数组中的每个值都是标量,所以我们知道我们谈论的是引用。 - hobbs
初始化一个N*N的数组:my @frame_events = ( map { [(0) x $n], (1..$n) } ); - aidan

7

3
在Perl中,一个包含两个数组的数组会合并成一个单一的数组。如果您不想将它们连接起来,则需要使用内部数组的引用。这是您代码的转储:
use strict;
use Data::Dumper;
my @frame_events = (((1) x 10), ((1) x 10));
print Dumper(\@frame_events);

结果:

$VAR1 = [
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1
        ];

如果您切换到数组引用创建器,使用方括号而不是圆括号,使用以下代码:

use strict;
use Data::Dumper;
my @frame_events = ([(1) x 10], [(1) x 10]);
print Dumper(\@frame_events);

您会得到以下内容:
$VAR1 = [
          [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
          ],
          [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
          ]
        ];

4
在Perl中,包含两个数组的数组被合并为一个单独的数组是不准确的描述。实际上,列表会被展开,这里并没有涉及到任何数组。 :) - hobbs
@Mark: 给一个人一条鱼,你能喂饱他一天。教他如何捕鱼,你就能喂他一生。Ry4n 给了你一条鱼。Vlad Romascanu 和 Sinan Ünür 正在试图教你如何捕鱼。 - Hynek -Pichi- Vychodil

-2

最快的方法是使用push命令。

$size = 10; push @matrix, [(0)x$size] for (0..$size);

这将创建一个大小为10x10的数组,并初始化为零。


实际上是一个10x11的矩阵。 - user90346

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接