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>

(或者如果需要,可以拆分它 - 我不知道您的拆分 /[>]/ 应该做什么:在 [] 中放入单个字符是没有意义的)。

于 2010-12-01T14:02:49.813 回答