アプリ版:「スタンプのみでお礼する」機能のリリースについて

Perlをもちいて塩基配列のチェックをおこないたいんですがどのようなプログラムを作成したらいいのかがわからないので教えてください。
以下の塩基配列のデータファイル(1)があります
塩基配列の説明文~
5’-ATATAGATAGATCATAGATCCCCGATAGCCCAGTAAATGATGACCCGATGATGACCCAGTACCCGGATGAGTAGTGATAGTACCCGTGTGTAAGTGATAGATAGTCCCATGTAGACAAAGATCCAGTAACGCGCGTTTTT-3’

これに対し、制限酵素A、B、Cを含んだデータファイル(2)があります。
ファイル形式は以下のような内容です。
制限酵素の説明文~
<1>A(制限酵素名)
<2>
<3>
<4> 5’-A^TAGT-3’(認識部位)

このデータファイル(1)に対し、(2)のファイル内の制限酵素A(認識部位5’-A^TAGT-3’)で切断する位置の数、位置の場所を表す番号(塩基配列の中の何番目か)を表示させるプログラムを作りたいんですがどのようにしたらいいんでしょうか?
プログラムを実行する際には以下の手順を踏んでおこないます。
./プログラムファイル名.pl 塩基配列ファイル名.fasta 制限酵素データファイル.txt 制限酵素名前(ここではAとする)
これらをおこなうために必要な点として自分が考えているのは、(2)のファイル内の制限酵素名Aを認識させるために正規表現で<1>を認識させるようにして、実行時に指定する制限酵素名がなければそこでプログラムを終了させ、逆に存在する場合は、塩基配列を認識する部位である<4> 5’-A^TAGT-3’(認識部位)の部分を読み込んで(1)のファイル内の塩基配列認識部位の数と位置を表示させるプログラムを組み込めばいいのではないかと考えているのですが、<1>A(制限酵素名)があった場合に<4> 5’-A^TAGT-3’(認識部位)を認識させるためにはどうしたらいいんでしょうか?

A 回答 (3件)

Perl はかなり柔軟な書き方ができますが、この2行を書いておくと少し厳しい文法を強要されるようになります。

数十行の使い捨てスクリプトを書くならばこの2行は要りませんが、将来的に数百、数千行のプログラムを書く可能性があるなら今からこの2行を入れても警告が出ないようなプログラムを書くようにするのが良いと思います。詳しくはGoogleあたりで調べてください。
    • good
    • 0

# ご質問の意味を一部取り違えていました。

すみません。
# それと、認識部位の位置取得が少しずれていたので直しました。
# 以下、修正版です。配列と制限酵素データはテストする都合上改変してあります。
# データファイル内が半角英数字のみであればJPerlでも同じ結果が出ると思います。

# EcoRI,3,[24;116;145]
# ↑実行結果:EcoRI切断部位が[24;116;145]に3箇所の意。

use strict;
use warnings;

my $seq = "ATATAGATAGATCATAGATCCCCGAATTCCCAGTAAATGATGACCCGATGATGACCCGTCGACAGTACCCGGATGAGTAGTGATAGTACCCGTGTGTAAGTGATAGATAGTCCCAGAATTCTGTAGACAAAGATCCAGTAACGCGAATTCGCGTTTTT";
my $re_name = 'EcoRI';

# 制限酵素のデータを全て文字列に読み込みます。
$/ = undef;
my $re_data = <DATA>;

# それぞれの制限酵素のデータに切り分けます。
my @res = $re_data =~ /^(<1>.+?<4>.+?)$/smg;

foreach my $re (@res)
{
# 制限酵素名
my ($ename) = $re =~ /<1>\s(\w+)/;
# 目的の制限酵素でなければ処理せず次へ。
next unless $ename eq $re_name;
# 認識部位
my ($cut) = $re =~ /<4>\s5\'-(.+?)-3\'/;
$cut =~ s/\^//;
my $cut_len = length($cut);

# 処理用に配列をコピーします。
my $tmp_seq = $seq;

my $tmp_pos = 0;
my @m_pos;

while(1)
{
# 認識部位が見つかった場所
my $pos = index($tmp_seq,$cut);
unless ($pos<0)
{
$tmp_pos = $tmp_pos+$pos+1;
push @m_pos, $tmp_pos;
# 配列から認識部位までを切り取ります。
$tmp_seq = substr $tmp_seq,$pos+$cut_len;
$tmp_pos = $tmp_pos+$cut_len-1;
}else{
last;
}
}

my $pstr = join ';', @m_pos;
my $mcnt = $#m_pos+1;
print $ename.",".$mcnt.",[".$pstr."]\n";

}

#system("PAUSE");

__DATA__
<1> EcoRI
<2>
<3>
<4> 5'-G^AATTC-3'

<1> HindIII
<2>
<3>
<4> 5'-A^AGCTT-3'

<1> SalI
<2>
<3>
<4> 5'-G^TCGAC-3'

この回答への補足

use strict;
use warnings;
はどんな意味があるんでしょうか?

補足日時:2007/12/26 01:03
    • good
    • 0
この回答へのお礼

わざわざ回答ありがとうございます。
早速試してみます。

またできなかった場合に補足の欄に記載させていただきますので宜しくお願いいたします。

お礼日時:2007/12/25 15:55

# もっと上手い方法があろうかと思いますが、


# ご参考まで。

use strict;
use warnings;

my $seq = "5'-ATATAGATAGATCATAGATCCCCGAATTCCCAGTAAATGATGACCCGATGATGACCCGTCGACAGTACCCGGATGAGTAGTGATAGTACCCGTGTGTAAGTGATAGATAGTCCCAGAATTCTGTAGACAAAGATCCAGTAACGCGAATTCGCGTTTTT-3'";

$/ = undef;
my $re_data = <DATA>;

my @res = $re_data =~ /^(<1>.+?<4>.+?)$/smg;

foreach my $re (@res)
{
my ($ename) = $re =~ /<1>(.+?)$/m;
chomp $ename;
my ($cut) = $re =~ /<4> 5\'-(.+?)-3\'/;
$cut =~ s/\^//;
my $cut_len = length($cut);

my $tmp_seq = $seq;
my $tmp_pos = 0;
my @m_pos;
while(1)
{
my $pos = index($tmp_seq,$cut);
unless ($pos<0)
{
$tmp_pos += $pos;
push @m_pos, $tmp_pos;
$tmp_seq = substr $tmp_seq,$pos+$cut_len;
}else{
last;
}
}

if ($#m_pos>-1)
{
my $pstr = join ';', @m_pos;
my $mcnt = $#m_pos+1;
print $ename.",".$mcnt.",[".$pstr."]\n";
}

}

#system("PAUSE");

__DATA__
<1>EcoRI
<2>
<3>
<4> 5'-G^AATTC-3'

<1>HindIII
<2>
<3>
<4> 5'-A^AGCTT-3'

<1>SalI
<2>
<3>
<4> 5'-G^TCGAC-3'

この回答への補足

$/ = undef;
my $re_data = <DATA>;
の意味は何でしょうか?
また<DATA>には質問欄に記載した各種の制限酵素が入ったファイルを代入すればよろしいんでしょうか?

補足日時:2007/12/26 01:11
    • good
    • 0
この回答へのお礼

すいません、もしよろしければ実行結果をお見せいただけませんでしょうか?
宜しくお願いします。
またJPerlでプログラムを実行しようと考えた場合、なにか大きな変化は出ますでしょうか?

お礼日時:2007/12/25 13:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!