2015-11-08 107 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