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’(認識部位)を認識させるためにはどうしたらいいんでしょうか?
No.3ベストアンサー
- 回答日時:
Perl はかなり柔軟な書き方ができますが、この2行を書いておくと少し厳しい文法を強要されるようになります。
数十行の使い捨てスクリプトを書くならばこの2行は要りませんが、将来的に数百、数千行のプログラムを書く可能性があるなら今からこの2行を入れても警告が出ないようなプログラムを書くようにするのが良いと思います。詳しくはGoogleあたりで調べてください。No.2
- 回答日時:
# ご質問の意味を一部取り違えていました。
すみません。# それと、認識部位の位置取得が少しずれていたので直しました。
# 以下、修正版です。配列と制限酵素データはテストする都合上改変してあります。
# データファイル内が半角英数字のみであれば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'
わざわざ回答ありがとうございます。
早速試してみます。
またできなかった場合に補足の欄に記載させていただきますので宜しくお願いいたします。
No.1
- 回答日時:
# もっと上手い方法があろうかと思いますが、
# ご参考まで。
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>には質問欄に記載した各種の制限酵素が入ったファイルを代入すればよろしいんでしょうか?
すいません、もしよろしければ実行結果をお見せいただけませんでしょうか?
宜しくお願いします。
またJPerlでプログラムを実行しようと考えた場合、なにか大きな変化は出ますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 飛行機・空港 女性客室乗務員(CA)にまで厳しいアルコール基準を設ける必要性 6 2022/09/03 21:11
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- 政治 日本が行うべき政策を考えてみました。総評をお願いします。 5 2022/08/20 11:47
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける (再質問) 4 2022/09/14 22:51
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- 生物学 字が汚くてすみません 高校生物の酵素についてです。 なぜ酵素濃度を2倍にしたとき青色じゃなく赤色のグ 2 2022/08/28 12:29
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- 統計学 お酒に強い人の割合について 2 2022/09/10 18:42
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
ディレクトリ名を取得したい
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
awkスクリプトでダブルクォーテ...
-
一行だけ読込
-
VBAでCSVファイルの特定行を書...
-
htaccessで特定のディレクトリ...
-
ファイル全てを .xlsm に変更し...
-
バッチファイルの作り方(CSV→...
-
close()で例外が投げられる理由
-
Perlで フォルダ内の全て...
-
perlを用いた特定文字列間の抽...
-
一定時間が経過したフォルダの削除
-
無料配布の郵便番号自動入力cgi...
-
VBAで巨大なファイルの途中から...
-
batファイルでrenameができませ...
-
Perl Vlookupみたいに
-
重複するデータを抽出できる秀...
-
タブの色を変更する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
C言語のバイナリモードでのfsca...
-
データの日付でソートをしたい
-
perlで複数行のデータを自由に...
-
perl-cgi 文字の長さでソートし...
-
Visual C++を用いたシリアル通信
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
VBAで巨大なファイルの途中から...
-
Perlで特定行から特定行までを...
-
ReadLineでの読み出し行を指定する
-
エクセルVBAで素数だけを出力す...
おすすめ情報