上記のスクリプトは現在のシーケンス識別子を記憶していないため、各シーケンスに関連付けられている識別子がわかりません。
以下のスクリプトを変更して、すべての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;
}