Ваш скрипт, как написано выше, не запоминает текущие идентификаторы последовательности, поэтому вы не знаете, какой идентификатор связан с каждой последовательностью.
Я изменил ваш скрипт ниже, чтобы прочитать все последовательности 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, "\n";
print $seqs{$id}, "\n";
}
}
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;
}