如何在Perl中将相同大小的数组合并为一个数组?

3

我有几个大小相同的数组,就像下面这样:

@m1= (1,1,0,1);
@m2= (0,1,1,1);
@m3= (0,1,1,0);
@m4= (1,1,0,0);

问题是如何将它放入一个数组中,就像这样?
@m = (
      [1,1,0,1],
      [0,1,1,1],
      [0,1,1,0],
      [1,1,0,0]
     );

2
问题是,你想复制数组还是创建引用? - TLP
更好的问题是,为什么你一开始就有4个单独的数组? - cjm
我想要复制这些数组。 - Nurahmad
3个回答

7

编辑:根据您的评论,如果您想要复制数组,我会这样做——

my @m = ( [ @m1 ], [ @m2 ], [ @m3 ], [ @m4 ] );

请参考 perldoc perlrefperldoc perlreftut 了解更多信息。
如果您想将它们压缩成一个数组:
my @m = ( @m1, @m2, @m3, @m4 );

如果您想要一个数组里嵌套了数组的引用:
my @m = ( \@m1, \@m2, \@m3, \@m4 );

例子:

use Data::Dumper;                                                                                                                                                                                          

my @m1= (1,1,0,1);                                                                                                                                                                                         
my @m2= (0,1,1,1);                                                                                                                                                                                         
my @m3= (0,1,1,0);                                                                                                                                                                                         
my @m4= (1,1,0,0);                                                                                                                                                                                         

my @m = ( @m1, @m2, @m3, @m4 );                                                                                                                                                                            
warn Dumper( \@m );                                                                                                                                                                                        

my @m_again = ( \@m1, \@m2, \@m3, \@m4 );                                                                                                                                                                  
warn Dumper( \@m_again ); 

输出:

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

6
你可以执行以下任一操作:
push @m, \@m1, \@m2,  ...       # references, using the same memory address
push @m, [ @m1 ], [ @m2 ], .... # making copies, placing them in anonymous arrays

这将创建一个二维数组,这正是您在问题中描述的,我假设您想要这样。当然,您不需要使用push,而可以使用任何方法来操作数组。


0
my @m = ( \@m1, \@m2, \@m3, \@m4 );

但是你最好一开始就避免将它们放入不同的数组中。


例如,
my @m1 = (1,1,0,1);
my @m2 = (0,1,1,1);
...
my @m = ( \@m1, \@m2, \@m3, \@m4 );

可以写成

my @m = (
   [1,1,0,1],
   [0,1,1,1],
   ...
);

例如,
my @m1 = f();
my @m2 = g();
...
my @m = ( \@m1, \@m2, \@m3, \@m4 );

可以写成:

my @m;
$m[0] = [ f() ];
$m[1] = [ g() ];
...

或者

my @m;
push @m, [ f() ];
push @m, [ g() ];
...

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