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....}

しかし、私がやりたいのは、1 行目の 2 列目と 2 行目の 3 列目(substr($seq,5239,5382))、そして 2 行目の 2 列目と 3 行目の 3 列目(substr($seq,5309,5487))..... それを行う最善の方法は何ですか? ?

4

3 に答える 3

2

まず、 のデフォルトの効果は空白でsplit分割さ$_れ、先頭と末尾の空のフィールドが破棄されることに注意してください。ほとんどの場合、これは必要なものであり、split /\s+/不要です。以外の変数でデフォルトの分割を呼び出したい場合は、正規表現ではなく$_単一のリテラル スペースをパターン引数として渡す必要があります (例: .split ' ', $line

mapを使用して、2 列目と 3 列目のデータだけの配列を作成することから始めることをお勧めします。

次に、データをループして、開始値と終了値を抽出し、シーケンスから遺伝子を引き出すことができます。

コードは次のようになります

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(配列の2 番目$#dataの要素) から(最後の要素) までであることに注意してください。これは、ループの本体がの要素の 1 列目と現在の要素の 2 列目をペアとして取り、1 番目の要素の前に要素がないためです。

substrまた、インデックスがゼロから始まるか1から始まるか、またはそのインデックスに文字が含まれているかどうかがわからないため、パラメーターを調整する必要がある場合があることに注意してください。

たとえば with$start = 1; $end = 2は、実際にorまたはを意味する場合にsubstr('ATC', $start, $end - $start);返されます。TAATTC

于 2012-05-23T12:25:37.840 に答える
1

あなたはすでに自分ですべてを理解していますが、使い方substrが間違っているだけです。のあらすじは次のようにperldoc -f substr述べています。

substr EXPR,OFFSET,LENGTH

しかし、あなたはそれに2つのオフセットを与えています。代わりに、一方のオフセットを他方から差し引いて、正しい長さパラメーターを計算します。

于 2012-05-23T10:39:55.273 に答える
0

2 次元配列を使用します。

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 に答える