- ベストアンサー
Perlを使った塩基配列のチェックについて
- Perlを使用して、塩基配列のチェックを行うプログラムを作成したいです。具体的な手順や必要な点について教えてください。
- 塩基配列データと制限酵素データをファイルで用意し、指定した制限酵素による切断位置と場所を表示するプログラムを作成したいです。
- プログラムの実行時には、塩基配列ファイル名、制限酵素データファイル名、制限酵素名を指定します。正規表現を使用して制限酵素名を認識させる方法についても教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Perl はかなり柔軟な書き方ができますが、この2行を書いておくと少し厳しい文法を強要されるようになります。数十行の使い捨てスクリプトを書くならばこの2行は要りませんが、将来的に数百、数千行のプログラムを書く可能性があるなら今からこの2行を入れても警告が出ないようなプログラムを書くようにするのが良いと思います。詳しくはGoogleあたりで調べてください。
その他の回答 (2)
- SE-1
- ベストアンサー率57% (26/45)
# ご質問の意味を一部取り違えていました。すみません。 # それと、認識部位の位置取得が少しずれていたので直しました。 # 以下、修正版です。配列と制限酵素データはテストする都合上改変してあります。 # データファイル内が半角英数字のみであれば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'
- SE-1
- ベストアンサー率57% (26/45)
# もっと上手い方法があろうかと思いますが、 # ご参考まで。 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'
お礼
すいません、もしよろしければ実行結果をお見せいただけませんでしょうか? 宜しくお願いします。 またJPerlでプログラムを実行しようと考えた場合、なにか大きな変化は出ますでしょうか?
補足
$/ = undef; my $re_data = <DATA>; の意味は何でしょうか? また<DATA>には質問欄に記載した各種の制限酵素が入ったファイルを代入すればよろしいんでしょうか?
お礼
わざわざ回答ありがとうございます。 早速試してみます。 またできなかった場合に補足の欄に記載させていただきますので宜しくお願いいたします。
補足
use strict; use warnings; はどんな意味があるんでしょうか?