2014-02-12 42 views
0

我有很多短陣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/ 

當我使用

[email protected]; 

它顯示6,但它應該是2.任何人都可以解釋原因以及如何改變它。

當我使用for循環添加的每個陣列

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

當我打印@add然後;只顯示內存地址,如何可以顯示所有數據@add

+0

你確實需要閱讀[perldoc perllol](http://perldoc.perl.org/perllol.html)。 –

回答

6

這是正常的行爲,如果你想@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以供參考。

1

push命令需要陣列列表。瞭解這裏發生的事情很重要。

第一個參數必須是ARRAY,這是你想推動的一個。之後,它期望LIST。這意味着這push語句提供列表上下文到任何@seq_ n數組 - 和排序展開爲單獨的元素。因此@seq_ n的所有元素都被推送到您的@add中。

既然你不希望這樣的事情發生,你想要保存的單獨列表的數組 - 我們在Perl調用列表 - 的 - 列出 - 你其實是想push參考,您的@seq_ ñ陣列,使用\字符。

push @add, \@seq_1, \@seq_2, . . . \@seq_n; 

現在你有確實持有至每$ seq_ ň引用數組。

整齊地打印出來,每個序列在自己的行,你可以遍歷每個

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的魅力。