【问题标题】:perl push many array in one arrayperl 将多个数组推入一个数组
【发布时间】:2014-02-12 06:44:38
【问题描述】:

我有很多短数组

 @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中的所有数据

【问题讨论】:

标签: perl


【解决方案1】:

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

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 以供参考。

【讨论】:

    【解决方案2】:

    push 命令采用 ARRAYLIST。了解这里发生的事情很重要。

    第一个参数必须是一个ARRAY,即你想要推动事物的那个。之后,它需要一个 LIST。这意味着此push 语句为任何@seq_n 数组提供list context - 并将数组扩展为单独的元素。所以@seq_n 的所有元素都被推送到你的@add 上。

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

    但是TIMTOWTDI

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2015-11-18
      • 2019-05-24
      相关资源
      最近更新 更多