2016-03-20 3 views
-8

У меня есть программа, предназначенная, чтобы вытащить строки из multifasta и запустить их через Threader:Проблем с «моим»

#¡/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 
} 

Когда я пытаюсь запустить его я получаю много вопросов, появляющуюся с «мой» :

«мое» переменный $ Outfile маска ранее заявление в том же заявлении на testfile4.pl линии 22.

«мои» переменные $ seq_id маски ранее декларирование в том же области в testfile4.pl линии 24.

«мое» переменные $ temp_fh масками ранее заявление в том же заявлении на testfile4.pl линии 26.

«мое» переменные $ seq_id масками ранее заявление в том же заявлении на testfile4.pl линии 26.

" мой»переменная $ SEQ маски ранее заявление в том же заявлении на testfile4.pl линии 26.

ошибка синтаксиса в testfile4.pl линии 24, возле„) {“

ошибка синтаксиса в testfile4.pl строке 31, рядом "}"

Выполнение testfile4.pl отменено из-за ошибок компиляции.

Кто-нибудь знает, что здесь происходит? Как я могу заставить его работать?

PS Я знаю, что, возможно, есть много других проблем с тем, как это написано. Я очень начинающий, мне не нужно, чтобы это было аккуратно или эффективно, мне просто нужно, чтобы он работал.

+7

Кэри, только фью и [шкала времени] (http://stackoverflow.com/posts/36114241/timeline). Мы не задаем вопросы, не получаем помощь, а затем удаляем вопрос. Это не то, как мы катаемся здесь. – Drew

+1

Пожалуйста, взгляните на [*** Что делать, если кто-то отвечает на мой вопрос? ***] (http://stackoverflow.com/help/someone-answers).Подсказка: он не говорит * удаляйте свой вопрос * – Borodin

+0

Я понял, что вопрос был таким глупым – Carey

ответ

3

Как подсказка - в любое время, когда вы получаете такую ​​ошибку, это обычно, потому что вы пропустили точку с запятой или скотч.

Как на этой линии:

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

Вам нужен semilcolon там. Вам также необходимо не my, потому что вы уже заявили $outfile как часть инструкции open.

Конечно, это также не имеет большого смысла закрывать его сразу же после открытия.

(также - то, что происходит с этим ! в хижину линии?)

Там также несколько других весьма странные вещи, происходящие здесь. Нравится:

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

Я не думаю, что это будет делать то, что вы хотите. Поскольку $out_fh - это дескриптор файла, вы будете печатать «GLOB (0xDEADBEEF)» или аналогичный.

+1

Спасибо, я думаю, что сейчас я отсортировал по крайней мере некоторые из ошибок. Это то, что происходит, когда вы пытаетесь изучить perl в сжатые сроки (очень грязный код). – Carey

+3

@ Кари особенно при обучении или в сжатые сроки, он действительно помогает получить одну маленькую деталь за время работы, используя известный хороший ввод и проверку вывода – ysth

+2

Лучший трюк: включите строгую и предостережения. Используйте 'Data :: Dumper', чтобы проверить, что вы получаете то, что, по вашему мнению, получаете в каждой точке программы. – Sobrique

Смежные вопросы