2013-02-22 6 views
3

Запуск этого кода приводит к ошибке «readline() на закрытой дескрипторе файла SEQFILE в строке 14.» В предыдущих поисковых запросах все прокомментировали, как следует положить некоторый тип условных после открытия. Это просто убивает программу (я оставил ее, чтобы я мог понять, почему она не открылась). Я бы предположил, что более глубокая проблема заключается в том, почему он не открывает мой файл?readline() на закрытой дескрипторе файла

#!/usr/bin/perl -w 

#Ask user to point to file location and collect from the keyboard 
print "Please specify the file location: \n"; 
$seq = <STDIN>; 

#Remove the newline from the filename 
chomp $seq; 

#open the file or exit 
open (SEQFILE, $seq); 

#read the dna sequence from the file and store it into the array variable @seq1 
@seq1 = <SEQFILE>; 

#Close the file 
close SEQFILE; 

#Put the sequence into a single string as it is easier to search for the motif 
$seq1 = join('', @seq1); 

#Remove whitespace 
$seq1 =~s/\s//g; 

#Use regex to say "Find 3 nucelotides and match at least 6 times 
my $regex = qr/(([ACGT]{3}) \2{6,})/x; 
$seq1 =~ $regex; 
printf "MATCHED %s exactly %d times\n", $2, length($1)/3; 
exit; 

ответ

4

Чтобы понять, почему open не удается, это изменить:

open (SEQFILE, $seq); 

к этому:

open (SEQFILE, $seq) or die "Can't open '$seq': $!"; 

(см. the perlopentut manpage)

+0

Три аргумента открыт лучше :) – squiguy

+1

Он не говорит «нет такого файла строка 11, линии 1», но я знаю, что файл есть! – Citizin

+0

@Citizin: Какова ценность '$ seq', которую он печатает? – ruakh

0

Также обратите внимание, что если вы используете || вместо «или» в строке следующим образом:

open SEQFILE, $ seq || die «Не могу открыть» $ seq ': $! ";

Это будет работать неправильно. Смотрите ссылку:

https://vinaychilakamarri.wordpress.com/2008/07/27/subtle-things-in-perl-part-2-the-difference-between-or-and/

+0

-1, извините. Вы неправильно поняли сообщение в блоге, на которое вы ссылаетесь. 'open (SEQFILE, $ seq) || die «Can not open» $ seq ': $! ";' actual * does * работает правильно, потому что когда первый токен после имени функции (в данном случае 'open') равен' (', Perl интерпретирует' ('как введение списка аргументов. (Который, кстати, не всегда то, что вы хотите - это означает, что' print (3 + 4)/2' эквивалентно '(print 7)/2', а не' print 3.5'. По этой причине, если вы включите предупреждения, Perl предупредит вас, если у вас есть пробел между именем функции и '('.) – ruakh

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