

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を探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlの無名配列の使い方を教え...
-
行・列の整理! perl
-
pandasでまとめてインデックス...
-
ファイルからある文字列の個数...
-
DBMとハッシュ
-
エクセルVBA コードが同じでも...
-
C言語の問題について
-
readdir()で得られるファイル・...
-
Perl で ディレクトリ及びサブ...
-
batファイルでrenameができませ...
-
Perlの変数に文字数制限(容量...
-
requireで同じライブラリを複数...
-
ReadLineでの読み出し行を指定する
-
「パスが見つかりません」とい...
-
C言語で特定の行を抽出する方法...
-
VBAでCSVファイルを途中行まで...
-
シェルスクリプトについて
-
CSVファイルのフォーマット
-
ファイル名を複数個配列で確保...
-
配列を使ってファイル名のリネーム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlでのテキスト処理について
-
PerlでInline Cを使った配列の...
-
[arduino]数値の大きなデータを...
-
逆順ソートのやりかた
-
単純なお問い合わせフォーム
-
配列のソートについて質問です。
-
2次元の配列にデータを格納したい
-
Perlの初歩的な質問・・・
-
配列の中に重複文字列があるか...
-
CSVデータ「","」と「,」混在読...
-
配列について
-
<IN>; を単独で使う
-
Visual C++を用いたシリアル通信
-
数十件あるデータを10件だけ表...
-
perlの無名配列の使い方を教え...
-
データの日付でソートをしたい
-
pandasでまとめてインデックス...
-
頻度表の作成(Perl初心者です)
-
要素を削除する最適な方法
-
数字のソート
おすすめ情報