下面是我搜索在命令行输入的用户提供的主题的FASTA文件的代码。当我运行它并输入一个我知道在文件中的主题它返回'Motif not found'。我只是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;
答案 0 :(得分: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论坛非常有帮助。
答案 1 :(得分:1)
您尝试读取文件名,而不是文件句柄。
替换
@seq = split(/[>]/, $filename);
通过
@seq = <DNAFILE>
(或者如果你需要的话可以拆分 - 我不知道你的分裂/ [&gt;] /应该做什么:在[]中放一个字符是没有意义的。