perl在一个数组中推送多个数组

perl在一个数组中推送多个数组,perl,Perl,我有很多短数组 @seq1 /773..1447/ @seq2 /1 2 1843..1881 1923..2001/ 但我用推 push(@add, @seq1); push(@add, @seq2); 但它显示了将所有数组合并为一个数组,无法再获得每个子数组 /773..1447 1 2 1843..1881 1923..2001/ 当我使用 $number=@add; 它显示6,但应该是2。谁能解释一下原因以及如何改变它 当我使用for循环添加每

我有很多短数组

 @seq1 /773..1447/        @seq2 /1 2 1843..1881 1923..2001/
但我用推

   push(@add, @seq1);
   push(@add, @seq2);
但它显示了将所有数组合并为一个数组,无法再获得每个子数组

  /773..1447 1 2 1843..1881 1923..2001/
当我使用

  $number=@add;
它显示6,但应该是2。谁能解释一下原因以及如何改变它

当我使用for循环添加每个数组时

   for(..){
 @temp= split(/,/,$_); 
 push(@add, \@temp);
 }

然后当我打印@add;它只显示内存地址,如何在@add中显示所有数据这是正常行为,如果希望@add是二维数组,请使用对@seq1的引用

push(@add, \@seq1);
要打印@add中的所有值,应使用Data::Dumper;打印转储程序\@添加

原因是当所有参数被推入数组时,它们都会被展平到列表中,所以

@a = @b = (1,2);
push(@add, @a, @b);
和写作一样

push(@add, $a[0],$a[1], $b[0],$b[1]);
检查和以供参考。

push命令获取一个数组和一个列表。理解这里发生的事情很重要

第一个参数必须是一个数组,一个你想要推进的数组。之后,它需要一个列表。这意味着这个push语句为任何@seq_n数组提供列表上下文,并将数组扩展为单独的元素。所以@seq_n的所有元素都被推到了@add上

因为您不希望发生这种情况,所以您需要一个包含单独列表的数组—我们在Perl中称之为列表列表—实际上您需要使用\字符推送对@seq_n数组的引用

push @add, \@seq_1, \@seq_2, . . . \@seq_n;
现在您有了一个数组,它确实包含了对每个$seq\n的引用

要将它们整齐地打印出来,每个序列都有自己的行,您可以对每个序列进行迭代

foreach my $seq (@add) {
  # $seq holds a reference to a list!
  my $string = join " ", @$seq; # the @ dereferences the $seq
  print $string, "\n";
}
但是蒂姆托蒂

<> P>总是考虑Perl的上下文,并尝试加入连接、GRIP和MAP的魅力。

你真的需要阅读。
print map {(join " ", @$_), "\n"} @add;