2013-04-21 49 views
0

我有這種類型的數據,需要(1)檢索每個內部的第一個元素(每個「數字集羣」中的5個元素,用「:」分隔)簇和(2)每組3個元素對檢索到的元素進行分組。如何正確使用數組,而不是使用動態標量變量

chr1 69270 . A G 1/1:208,34:244:14.96:118,15,0 0/1:186,51:241:8.72:80,0,9 0/0:226,1:236:3.01:0,3,30 ./. 1/1:209,35:250:12:116,12,0 ./. 1/1:186,53:242:14.97:126,15,0 0/0:245,0:248:3.01:0,3,33 1/1:182,60:243:23.95:201,24,0 

我相信有更好的方法來做到這一點。但是到現在爲止,我只能想到使用殘酷的武力,這總是很糟糕。另一種選擇是使用動態標量,但基本上動態標量可以完成下面的錯誤代碼。我沒有看到太多的改進,而其他人在使用動態標量時總是說(總)不好。

我仍在閱讀perl開始,所以不知道還有哪些其他選項可用。任何幫助將不勝感激。

my @genotype1 = split (/:/, $original_line[6]); 
my @genotype2 = split (/:/, $original_line[7]); 
my @genotype3 = split (/:/, $original_line[8]); 
my @genotype4 = split (/:/, $original_line[9]); 
my @genotype5 = split (/:/, $original_line[10]); 
my @genotype6 = split (/:/, $original_line[11]); 
my @genotype7 = split (/:/, $original_line[12]); 
my @genotype8 = split (/:/, $original_line[13]); 
my @genotype9 = split (/:/, $original_line[14]); 
my @trio1 = ($genotype1[0], $genotype2[0], $genotype3[0]); 
my @trio2 = ($genotype4[0], $genotype5[0], $genotype6[0]); 
my @trio3 = ($genotype7[0], $genotype8[0], $genotype9[0]); 
+0

什麼是動態標量?在stackoverflow上搜索「動態標量」會產生另外兩個問題,它們都不涉及Perl。 – mob 2013-04-21 00:17:51

+1

@mob:我*想*他可能意味着符號引用,但這幾乎只是一個猜測。 – jwodder 2013-04-21 00:21:42

回答

3

如果您使用的 「動態變量」,你將有

for (6..14) { 
    @{ "genotype".($i-6) } = split (/:/, $original_line[$i]); 
} 

它只是改變

my @genotypes; 
for (6..14) { 
    @{ $genotypes[$i-6] } = split (/:/, $original_line[$i]); 
} 

這可能是有點清潔器

my @genotypes; 
for (6..14) { 
    $genotypes[$i-6] = [ split (/:/, $original_line[$i]) ]; 
} 

my @genotypes; 
for (6..14) { 
    push @genotypes, [ split (/:/, $original_line[$i]) ]; 
} 

my @genotypes; 
for (@original_line[6..14]) { 
    push @genotypes, [ split /:/ ]; 
} 

my @genotypes = map { [ split /:/ ] } @original_line[6..14]; 

但是,你只需要在第一個元素,所以你可以使用

my @genotypes = map { (split /:/)[0] } @original_line[6..14]; 

然後,你需要的是搶來自該陣列的三個元素一次,所以你得到:

my @genotypes = map { (split /:/)[0] } @original_line[6..14]; 

my @trioes; 
while (@genotypes) { 
    push @trios, [ splice @genotypes, 0, 3 ]; 
} 
3

有幾種不同的方法可以使您的代碼更高效;大多數(所有?)都會利用這樣一個事實,即您只使用每個@genotype列表的第一個元素。舉個例子:

my @elements = map { (split /:/)[0] } @original_line[6..14]; 
my @trio1 = @elements[0,1,2]; 
my @trio2 = @elements[3,4,5]; 
my @trio3 = @elements[6,7,8];