2015-11-08 113 views
0

我在修复代码中的错误时遇到问题。我试图让代码读取输入文件,并只提取[]之间的内容。然而,我得到的错误是readline() on unopened filehandle ...我不知道我在这里为while()文件句柄错误地做了什么。readline()在Perl中未打开的文件句柄错误

#!/usr/bin/perl 
use warnings; 

my $file = ''; 
my $newfile = ''; 
open($newfile, '>', 'newmyosin.fasta') or die "Can't create file", $!; 
open($file, '<', 'myosin.fasta') or die "Can't open file", $!; 

while(<$file>) { 
     print; 
     chomp; 
     if ($_ =~ /\[(.+)\]/) { 
       $file = $1; 
     } 
} 

因此,举例来说:

这会是什么我输入文件的一个组成部分看起来像:

>gi|115527082|ref|NP_005954.3| myosin-1 [Homo sapiens] 
>gi|226694176|sp|P12882.3|MYH1_HUMAN RecName: Full=Myosin-1; AltName: Full=Myosin heavy chain 1; AltName: Full=Myosin heavy chain 2x; Short=MyHC-2x; AltName: Full=Myosin heavy chain IIx/d; Short=MyHC-IIx/d; AltName: Full=Myosin heavy chain, skeletal muscle, adult 1 [Homo sapiens] 
>gi|119610411|gb|EAW90005.1| hCG1986604, isoform CRA_b [Homo sapiens] 
MSSDSEMAIFGEAAPFLRKSERERIEAQNKPFDAKTSVFVVDPKESFVKATVQSREGGKVTAKTEAGATVTVKDDQVFPM 
NPPKYDKIEDMAMMTHLHEPAVLYNLKERYAAWMIYTYSGLFCVTVNPYKWLPVYNAEVVTAYRGKKRQEAPPHIFSISD 
NAYQFMLTDRENQSILITGESGAGKTVNTKRVIQYFATIAVTGEKKKEEVTSGKMQGTLEDQIISANPLLEAFGNAKTVR 
NDNSSRFGKFIRIHFGTTGKLASADIETYLLEKSRVTFQLKAERSYHIFYQIMSNKKPDLIEMLLITTNPYDYAFVSQGE 
ITVPSIDDQEELMATDSAIEILGFTSDERVSIYKLTGAVMHYGNMKFKQKQREEQAEPDGTEVADKAAYLQNLNSADLLK 
ALCYPRVKVGNEYVTKGQTVQQVYNAVGALAKAVYDKMFLWMVTRINQQLDTKQPRQYFIGVLDIAGFEIFDFNSLEQLC 
INFTNEKLQQFFNHHMFVLEQEEYKKEGIEWTFIDFGMDLAACIELIEKPMGIFSILEEECMFPKATDTSFKNKLYEQHL 
GKSNNFQKPKPAKGKPEAHFSLIHYAGTVDYNIAGWLDKNKDPLNETVVGLYQKSAMKTLALLFVGATGAEAEAGGGKKG 
GKKKGSSFQTVSALFRENLNKLMTNLRSTHPHFVRCIIPNETKTPGAMEHELVLHQLRCNGVLEGIRICRKGFPSRILYA 
DFKQRYKVLNASAIPEGQFIDSKKASEKLLGSIDIDHTQYKFGHTKVFFKAGLLGLLEEMRDEKLAQLITRTQAMCRGFL 
ARVEYQKMVERRESIFCIQYNVRAFMNVKHWPWMKLYFKIKPLLKSAETEKEMANMKEEFEKTKEELAKTEAKRKELEEK 
MVTLMQEKNDLQLQVQAEADSLADAEERCDQLIKTKIQLEAKIKEVTERAEDEEEINAELTAKKRKLEDECSELKKDIDD 
LELTLAKVEKEKHATENKVKNLTEEMAGLDETIAKLTKEKKALQEAHQQTLDDLQAEEDKVNTLTKAKIKLEQQVDDLEG 
SLEQEKKIRMDLERAKRKLEGDLKLAQESTMDIENDKQQLDEKLKKKEFEMSGLQSKIEDEQALGMQLQKKIKELQARIE 
ELEEEIEAERASRAKAEKQRSDLSRELEEISERLEEAGGATSAQIEMNKKREAEFQKMRRDLEEATLQHEATAATLRKKH 
ADSVAELGEQIDNLQRVKQKLEKEKSEMKMEIDDLASNMETVSKAKGNLEKMCRALEDQLSEIKTKEEEQQRLINDLTAQ 
RARLQTESGEYSRQLDEKDTLVSQLSRGKQAFTQQIEELKRQLEEEIKAKSALAHALQSSRHDCDLLREQYEEEQEAKAE 

离开这里,我想创建一个新的文件“ newmyosin.fasta”,这将在括号内拉出生物体名称在标题为这个样品(例如[Homo sapiens]。Perl的代码用于从具有多个样本myosin.fasta文件如上述在读,内挑出名括号[],并写出来一个新文件(例如newmyosin.fasta)。

谢谢!

+0

你在开始你的文件句柄设置为空字符串,那么你将它重新分配给循环中的一个字符串。不要这样做。 –

+0

那么你会怎么建议我修复代码? – Elle

+0

使用其他变量来存储正则表达式匹配的结果。我可以在后面写出正确的答案。 –

回答

2

当你这样做:

$file = $1; 

您覆盖您的文件句柄。那么你不能再读取它。你会得到提及的错误。

你当然应该挽救赛别的地方,例如:

my $match = $1; 

大概也打印:

print $newfile $match; 
0

正如我在comment说,你重新分配你的文件句柄来捕获组中读取文件中间。既然你打开了一个单独的文件输出,我假设你想打印匹配的字符串到该文件。

话虽如此,您的要求是非常模糊的,您的示例输入看起来不准确,并且您没有提供任何示例输出,但如果我正确理解您的意图,我认为这是你想要的:

my $file = 'myosin.fasta'; 
my $tmp = "$file.tmp"; 

open(my $new, '>', $tmp) or die "Can't open $tmp: $!"; 
open(my $old, '<', $file) or die "Can't open $file: $!"; 

while (<$old>) { 
    if (/\[([^]]+)\]/) { 
     print $new "$1\n"; 
    } 
} 

close($old); 
close($new); 

rename($file, "$file.bak"); 
rename($tmp, $file); 

myosin.fasta的内容脚本运行后:

Homo sapiens 
Homo sapiens 
Homo sapiens