2010-12-01 6 views
3

以下は、ユーザ提供のモチーフのコマンドラインで入力したFASTAファイルを検索するためのコードです。私がそれを実行し、私が知っているモチーフを入力すると、それは「Motif not found」を返します。私はPerlの唯一の初心者ですが、タイトルラインを返すことなく、見つけたモチーフを印刷する方法を見つけ出すことはできません。私はこれを解決するための任意の助けに感謝します。モチーフのFASTAファイルを検索し、モチーフを含む各シーケンスのタイトル行を返す

ありがとうございました。

use warnings; 
use strict; 


my $motif; 
my $filename; 
my @seq; 
#my $motif_found; 
my $scalar; 

$filename = $ARGV[0]; 

open (DNAFILE,$filename) || die "Cannot open file\n"; 
@seq = split(/[>]/, $filename); 
print "Enter a motif to search for; "; 

$motif = <STDIN>; 

chomp $motif; 
foreach $scalar(@seq) { 
    if ($scalar =~ m/$motif/ig) { 
     print "Motif found in following sequences\n"; 
     print $scalar; 
    } else { 
     print "Motif was not found\n"; 
    } 
} 
close DNAFILE; 
+1

1行のコードが何をしているかを説明するコメントは書かないでください。彼らは何も追加しません。 –

+1

DNA配列が複数の行に分割されているFastaファイルを処理しますか?私はBioPerlのFastaパーサーの使用をお勧めします。 –

答えて

1

ファイルハンドルではなくファイル名から読み取ろうとしています。あなたがする必要がある場合

@seq = split(/[>]/, $filename); 

@seq = <DNAFILE> 

で交換する(またはそれを分割する - 私は知らない何をお使いのスプリット/ [>] /やってないことになっている:何があります[]に1文字を入れることを指す)。

2

「独自の」Fastaパーサーを使用することには意味がありません。 BioPerlは長年の開発に費やしてきました。それを使用しないことは愚かです。

use strict; 
use Bio::SeqIO; 

my $usage = "perl dnamotif.pl <fasta file> <motif>"; 
my $fasta_filename = shift(@ARGV) or die("Usage: $usage $!"); 
my $motif = shift(@ARGV) or die("Usage: $usage $!"); 

my $fasta_parser = Bio::SeqIO->new(-file => $fasta_filename, -format => 'Fasta'); 
while(my $seq_obj = $fasta_parser->next_seq()) 
{ 
    printf("Searching sequence '%s'...", $seq_obj->id); 
    if((my $pos = index($seq_obj->seq(), $motif)) != -1) 
    { 
    printf("motif found at position %d!\n", $pos + 1); 
    } 
    else 
    { 
    printf("motif not found.\n"); 
    } 
} 

このプログラムは、各配列の最初のモチーフの一致の(1ベースの)位置のみを検出します。それは簡単に各試合の位置を見つけるために編集することができます。また、必要なフォーマットで正確に印刷することもできません。私はこれらの問題を「読者のための練習」としておきます。 :)

BioPerlをダウンロードする必要がある場合は、this linkを試してください。問題がある場合は教えてください。

このようなバイオインフォマティクスの質問については、BioStarフォーラムが非常に役立ちます。

関連する問題