4

以下は、コマンドラインで入力された FASTA ファイルを検索して、ユーザーが提供したモチーフを検索するためのコードです。それを実行して、ファイルにあることがわかっているモチーフを入力すると、「モチーフが見つかりません」と返されます。私は Perl の初心者にすぎません。タイトル行を返すどころか、見つかったモチーフを印刷する方法もわかりません。これを解決するための助けをいただければ幸いです。

ありがとう。

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;
4

2 に答える 2

4

「独自の」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 をダウンロードする必要がある場合は、このリンクを試してください。問題がある場合はお知らせください。

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

于 2010-12-01T15:26:23.250 に答える
1

ファイルハンドルではなく、ファイル名から読み取ろうとしています。

交換

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

@seq = <DNAFILE>

(または、必要に応じて分割します-分割/ [>] /が何をしているのかわかりません。[]に1文字を入れても意味がありません)。

于 2010-12-01T14:02:49.813 に答える