1

我有一个文件File1包含这些数据:

NC_009066   5239    5308    trnA(tgc)   2.10899859667e-09   -
NC_009066   5309    5382    trnN(gtt)   7.03000463545e-10   -
NC_009066   5422    5487    trnC(gca)   7.09999799728e-08   -
NC_009066   5487    5557    trnY(gta)   3.72200156562e-11   -
NC_009066   5549    7097    cox1    291081744.81    +
NC_009066   7109    7180    trnS2(tga)  1.83000043035e-09   -
NC_009066   7183    7256    trnD(gtc)   2.5720000267e-09    +

和另一个fasta文件File2

> NC_009066,1,0-17045,
GCTATCGTAGCTTAATTAAAGCATAACACTGAAGATGTTAAGATGAACCCTAGAAA

我已将 file1 逐行放入一个数组中,然后我可以通过在/\s+/.

for $line(@array){
    @column= split(/\s+/,$line);
    # print $column[5]."\n";

$gene=substr($seq,$column[1],$column[2]);#$seq extracted from File2....}

但我想做的是从第一行取第二列,从第二行取第三列(substr($seq,5239,5382)),然后从第二行取第二列,从第三行取第三列(substr($seq,5309,5487)).....最好的方法是什么? ?

4

3 回答 3

2

首先,注意 的默认效果split是分割$_空白,丢弃前导和尾随的空字段。大多数情况下,这是您想要的,而且split /\s+/是不必要的。如果要对变量调用默认拆分,则$_必须传递单个文字空间,而不是正则表达式,作为模式参数,例如split ' ', $line.

我建议您首先使用map创建一个仅包含第二列和第三列中的数据的数组。

然后你可以遍历数据,提取起始值和结束值并将基因从序列中拉出。

代码看起来像这样

use strict;
use warnings;

open my $fh, '<', 'f1.txt' or die $!;

my @data = map [ (split)[1,2] ], <$fh>;

my $seq = 'GCTATCGTAGCTTAATTAAAGCATAACACTGAAGATGTTAAGATGAACCCTAGAAA';

for my $i (1 .. $#data) {
  my ($start, $end) = ( $data[$i-1][0], $data[$i][1] );
  my $gene = substr($seq, $start, $end - $start);
  print "$gene\n";
}

请注意,循环是通过索引1(数组的第二个元素)到$#data(最后一个元素)。这是因为循环体将前一个元素的第一列和当前元素的第二列作为一对,并且第一列之前没有元素。

另请注意,您可能必须将参数调整为,substr因为我不知道您的索引是从零开始还是从一开始,或者它们是否包含该索引处的字符。

例如,当您实际表示or或时$start = 1; $end = 2substr('ATC', $start, $end - $start);会返回。TAATTC

于 2012-05-23T12:25:37.840 回答
1

您已经自己弄清楚了一切,只是您使用substr不正确。里面的梗概perldoc -f substr说:

substr 表达式,偏移量,长度

但你给它两个偏移量。相反,从另一个偏移量中减去一个偏移量以计算正确的长度参数。

于 2012-05-23T10:39:55.273 回答
0

使用二维数组:

for (my $i = 0; $i < scalar(@array); ++$i) {
    $$table[$i] = [ split(/\s+/,$array[$i]) ];
}

# you may put this into a loop
$start = $$table[0][1];
$end = $$table[1][2] - $$table[0][1];
$gene = substr($seq, $start, $end);

另见perllol

于 2012-05-23T11:52:01.083 回答