如何正确使用数组,而不是使用动态标量变量

时间:2013-04-21 00:07:20

标签: perl

我有这种数据,需要(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

我相信有更好的方法可以做到这一点。但截至目前,我只能想到使用残酷的力量,这总是很糟糕。另一种选择是使用动态标量,但基本上动态标量将完全与下面的错误代码相同。我没有看到太多改进,stackoverflow的其他人说使用动态标量也是坏事。

我仍在阅读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]);  

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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 ];
}