【问题标题】:How can I initialize a 2D array in Perl?如何在 Perl 中初始化二维数组?
【发布时间】:2011-01-27 01:57:35
【问题描述】:

如何在 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") 作为 ARRAY ref。

这种语法似乎只初始化一维数组,因为 print "$frame_events[1]\n" 有效。虽然 Perl 在赋值过程中没有给出任何错误。

【问题讨论】:

    标签: perl arrays


    【解决方案1】:

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

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

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

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

    一般而言,您不能拥有:

    • 数组的数组(数组的...)
    • 哈希数组(...)
    • 数组散列
    • 哈希值。

    可以拥有:

    • references 到数组的数组(references 到数组...)
    • references 到散列的数组(references 到 ...)
    • 引用到数组的散列
    • 散列引用到散列

    您还可以:

    • 标量数组
    • 引用数组标量数组
    • references 数组 references 数组 标量数组
    • 标量散列的引用数组

    【讨论】:

    • 请注意,这并不能阻止人们在日常对话中说“哈希哈希”、“哈希数组”等,因为理解中的每个值哈希或数组是标量,所以我们都知道我们在谈论引用。
    • 初始化一个 N*N 数组:my @frame_events = ( map { [(0) x $n], (1..$n) } );
    【解决方案2】:

    【讨论】:

      【解决方案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
                ]
              ];
      

      【讨论】:

      • “在 Perl 中,一个包含两个数组的数组被合并为一个数组”——不准确。 列表得到扁平化。这里没有数组。 :)
      • @Mark:给男人一条鱼,你今天就喂他。教人捕鱼,你会养活他一辈子。 Ry4n 给了你鱼。 Vlad Romascanu 和 Sinan Ünür 正在尝试教你渔业。
      【解决方案4】:

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

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

      这将创建一个用零初始化的 10x10 数组。

      【讨论】:

      • 实际上是一个 10x11 矩阵。
      猜你喜欢
      • 2011-12-08
      • 2011-04-12
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      相关资源
      最近更新 更多