2016-03-20 32 views
-8

Ben MultiFASTA dışına çizgilerini çekin ve Threader yoluyla bunları çalıştırmak için tasarlanmış bir program var:Sorunları 'benim'

#¡/usr/bin/perl 
use warnings; 
use strict; 
use File::Temp qw(tempfile); 

my $filename = 'unchar_prot'; #open file 
open (my $fh, '<:encoding(UTF-8)', $filename) 
    or die "Error - cannot open file"; 

my %id2seq =(); #create a hash 
my $seq_id = ''; 
while (my $line = <$fh>) { 
    chomp $line; 
    if ($line =~ /^>(.+)/) { #Find lines starting in > 
     $seq_id = $1; 
    } else { 
     $id2seq{$seq_id} .= $line; #Store seq and ID on hash 
    } 
} 

open(my $outfile, '>', 'out.txt') or die 
close (my $outfile) 

while (my ($seq_id, $seq) = each %id2seq) { #Call key and value from hash 
    my ($temp_fh, $prot) = tempfile ("tempXXXX", SUFFIX => '.seq'); #create a temporary file 
    print $temp_fh ">$seq_id\n$seq\n"; #print the 2 lines to the temp file 
    my ($out_fh, $out) = tempfile("outXXXX", SUFFIX => '.txt'); # create a temporary outfile 
    system ('nohup threader -p $temp_fh $out_fh cdc6.lst &'); #call threader 
    open($outfile, '>>', 'out.txt'); 
    print $outfile "$out_fh"; # append the content of the temp out to the main outfile 
} 

Ben birçok konu 'gözlerimi' ile kırpma olsun çalıştırmayı deneyin :

testfile4.pl hattı 22.

aynı açıklamada "my" değişken $ ÇıkışDosyası maskeleri önceki deklarasyon "my" değişken $ seq_id maskeleri testfile4.pl hattında aynı kapsamda önceki beyanı 24.

testfile4.pl hattında aynı açıklamada "my" değişken $ temp_fh maskeleri önceki beyanı 26.

testfile4.pl hattında aynı açıklamada "my" değişken $ seq_id maskeleri önceki beyanı 26.

" benim" testfile4.pl hattında aynı açıklamada değişken $ seq maskeleri önceki beyan testfile4.pl hattı 24 yakın at 26.

sözdizimi hatası ") {" testfile4.pl hattı 31 at

sözdizimi hatası, yakın "}"

Testfile4.pl dosyasının derlenmesi, derleme hataları nedeniyle iptal edildi.

Burada neler olup bittiğini bilen var mı? Kaçmak için nasıl alabilirim?

PS Bunun nasıl yazılacağıyla ilgili birçok başka sorun olduğunu biliyorum. Ben çok yeni başlayan biriyim, henüz düzenli ya da verimli olmak için buna ihtiyacım yok, sadece işe ihtiyacım var.

+7

Carey, sadece bir fyi ve [zaman çizelgesi] (http://stackoverflow.com/posts/36114241/timeline). Soru sormayız, yardım almaz, sonra soruyu sileceğiz. Bu, buraya nasıl döneceğimiz değil. – Drew

+1

Lütfen bir göz atın [*** Birisi soruma cevap verdiğinde ne yapmalıyım? ***] (http://stackoverflow.com/help/someone-answers).İpucu: * Söylemiyor * Sorunuzu sil * – Borodin

+0

Sorunun aptalca bir şey olduğunu anladım. – Carey

cevap

3

Bir ipucu olarak - herhangi bir hatayla karşılaştığınız her an, bir noktalı virgül veya yakın köşeli ayraç kaçırdığınız için bu genellikle olur. Bu hat üzerinde

gibi:

open(my $outfile, '>', 'out.txt') or die 
close (my $outfile) 

Orada bir semilcolon gerekir. my'u da kullanmamalısınız, çünkü zaten $outfile bildirimini open bildiriminin bir parçası olarak bildirdiniz. Tabii ki, açıldıktan hemen sonra kapanması da büyük bir anlam ifade etmiyor.

(Ayrıca - Ne shebang hattında o ! ile oluyor?)

burada da bunun birkaç diğer oldukça garip şeyler var. Mesela:

print $outfile "$out_fh"; # append the content of the temp out to the main outfile 

Bunun ne istediğinizi yapacağını sanmıyorum. $out_fh bir dosya tanıtıcısı olduğundan, "GLOB (0xDEADBEEF)" veya benzeri yazdırırsınız.

+1

Teşekkür ederim, sanırım şu an en azından bazı hataları sıralıyorum. Bu, özellikle öğrenirken ya da sıkı bir son tarihte, sıkı bir son tarihte (çok dağınık kod) – Carey

+3

@Carey'i öğrenmeye çalışmanın getirdiği şeydir, bilinen iyi girişi ve çıktıyı doğrulamak için, bir kerede çalışan küçük bir parçanın elde edilmesine gerçekten yardımcı olur. – ysth

+2

En iyi numara: Sıkı ve uyarıları açın. Programın her noktasında aldığınızı düşündüğünüz şeyi aldığınızı kontrol etmek için 'Veri :: Damper'i kullanın. – Sobrique