上面所写的脚本不记得当前的序列标识符,因此您不知道哪个标识符与每个序列相关联。
我修改了下面的脚本,将所有FASTA序列读取到一个映射的哈希中(标识符=>;序列),然后迭代该哈希,在适当的时候打印出匹配项。对于非常大的序列文件来说,这是一种不合适的方法,但在编写分析数据的新脚本时,学习如何编写这样的小辅助函数可能会大大加快速度。了解如何在Perl中使用和操作散列和其他数据结构也很重要,因为您遇到的大多数代码都不是由初学者编写的。
#!/usr/bin/perl
use strict;
use warnings;
print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;
my %seqs = %{ read_fasta_as_hash( data.fa ) };
foreach my $id ( keys %seqs ) {
if ( $seqs{$id} =~ /$motif/ ) {
print $id, "
";
print $seqs{$id}, "
";
}
}
sub read_fasta_as_hash {
my $fn = shift;
my $current_id = ;
my %seqs;
open FILE, "<$fn" or die $!;
while ( my $line = <FILE> ) {
chomp $line;
if ( $line =~ /^(>.*)$/ ) {
$current_id = $1;
} elsif ( $line !~ /^s*$/ ) { # skip blank lines
$seqs{$current_id} .= $line
}
}
close FILE or die $!;
return \%seqs;
}