我有很多短阵列
@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中的所有数据
答案 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]);
答案 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的魅力。