4

multi fasta ファイルでモチーフを検索し、モチーフを含む行を印刷することはできますが、fasta シーケンスを含むモチーフのヘッダー行と共にすべてのシーケンスを印刷する必要があります。助けてください私はperlの初心者です

#!usr/bin/perl -w
use strict;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;


my $line;
open (FILE, "data.fa");
while ($line = <FILE>) {
  if ($line =~ /$motif/)  {
     print $line;
   }
}
4

3 に答える 3

3

これを試して:

Bio :: DB :: Fasta

ページの説明。その他の例や手順については、Googleで「useBio :: DB::Fasta」を検索してください。

これをインストールするには、次の手順のいずれかに従うだけです。スーパーユーザーとしてCPAN.pmメソッドを使用することをお勧めします。

Perlモジュールのインストール

于 2011-02-08T05:58:24.290 に答える
2

上記のスクリプトは現在のシーケンス識別子を記憶していないため、各シーケンスに関連付けられている識別子がわかりません。

以下のスクリプトを変更して、すべての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;
}
于 2011-02-16T17:24:18.177 に答える