2010-12-01 3 views
3

다음은 사용자가 제공 한 모티프에 대해 명령 행에서 입력 한 FASTA 파일을 검색하는 코드입니다. 내가 그것을 실행하고 파일에있는 모티프를 입력하면 'Motif not found'가 반환됩니다. 필자는 Perl의 초보자 일 뿐이며 제목 줄을 반환하지 않고 발견 된 모티브를 인쇄하는 방법을 알아낼 수는 없습니다. 이 문제를 해결할 수있는 도움을 주시면 감사하겠습니다.모티프에 대한 FASTA 파일 검색 및 모티프가 포함 된 각 시퀀스의 제목 줄 반환

감사합니다.

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; 
+1

한 줄로 된 코드에 대한 설명을 쓰지 마십시오. 그들은 아무 것도 추가하지 않습니다. –

+1

DNA 시퀀스가 ​​여러 줄로 나뉘어있는 Fasta 파일을 처리합니까? BioPerl의 Fasta 파서를 사용하는 것이 좋습니다. –

답변

1

파일 핸들이 아닌 파일 이름을 읽으려고합니다. 당신이해야하는 경우

@seq = split(/[>]/, $filename); 

@seq = <DNAFILE> 

으로 교체 (또는 분할 - 나도 몰라 무엇 귀하의 분할/[>]/수행되지 않을 것으로 예상되는 : 더있다 [] 안에 하나의 문자 넣기를 가리킨다).

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 포럼이 매우 유용하다는 것을 발견했습니다.