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

时间:2014-02-12 06:44:38

标签: 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循环添加每个数组时

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

然后当我打印@add;它只显示内存地址,如何显示@add中的所有数据

2 个答案:

答案 0 :(得分:6)

这是正常行为,如果您希望@seq1为二维数组,请使用@add的引用,

push(@add, \@seq1);

要在@add中打印所有值,您应该use Data::Dumper; print Dumper \@add;

原因是所有参数在被推入数组时都会变为列表,所以

@a = @b = (1,2);
push(@add, @a, @b);

与写作相同

push(@add, $a[0],$a[1], $b[0],$b[1]);

检查perlrefperllol以供参考。

答案 1 :(得分:1)

push命令采用 ARRAY LIST 。了解这里发生的事情非常重要。

第一个参数必须一个 ARRAY ,即您要推送的那个。之后,它需要 LIST 。这意味着这个push语句为任何@seq_ n 数组提供列表上下文 - 并将数组扩展为单独的元素。所以@seq_ n 的所有元素都被推送到@add。

由于您不希望这种情况发生,您需要一个包含单独列表的数组 - 我们在Perl中称之为列表列表 - 您实际上想要push对@seq_ <的引用em> 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";
}

TIMTOWTDI

print map {(join " ", @$_), "\n"} @add;

始终考虑Perl中的上下文,并尝试使用join,grep和map的魅力。