2015-11-08 1 views
0

J'ai des problèmes pour corriger une erreur dans mon code. J'essaye d'obtenir le code pour lire le dossier d'entrée et pour sortir seulement ce qui est entre le []. Cependant, l'erreur que je reçois est un readline() on unopened filehandle ... Je ne suis pas sûr de ce que je fais mal ici pour la poignée de fichier while().readline() erreur de handle de fichier non ouvert en 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; 
     } 
} 

Ainsi, par exemple:

Ce serait ce qu'une partie de mon dossier d'entrée ressemblerait à ceci:

>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 

Sur ce, je voudrais créer un nouveau fichier " newmyosin.fasta "qui va retirer le nom de l'organisme entre crochets dans l'en-tête de cet exemple (par exemple, [Homo sapiens].) Le code Perl est utilisé pour lire le fichier myosin.fasta avec plusieurs échantillons comme ci-dessus, choisir le nom dans le support [], et écrire à un nouveau fichier (par ex. newmyosin.fasta).

Merci!

+0

vous configurez votre descripteur de fichier à une chaîne vide au début, et alors vous ré-attribuez-le à une chaîne dans votre boucle. Ne fais pas ça. –

+0

Alors, que suggérez-vous que je fasse pour corriger le code? – Elle

+0

Utilisez une variable différente pour stocker le résultat de la correspondance regex. Je peux écrire une bonne réponse plus tard. –

Répondre

2

Lorsque vous faites ceci:

$file = $1; 

Vous remplacez votre handle de fichier. Alors vous ne pouvez plus en lire. Et vous obtiendrez l'erreur mentionnée.

Vous devez d'économiser bien sûr le match ailleurs, par exemple:

my $match = $1; 

Et probablement aussi imprimer:

print $newfile $match; 
0

Comme je l'ai dit dans comment, vous ré-attribuez votre handle de fichier au groupe de capture au milieu de la lecture du fichier. Puisque vous avez ouvert un fichier séparé pour la sortie, je suppose que vous voulez imprimer les chaînes correspondantes à ce fichier à la place. Cela dit, vos exigences sont assez vagues, votre entrée d'échantillon n'a pas l'air exacte, et vous n'avez fourni aucun exemple de sortie, mais si je comprends bien votre intention, je pense que c'est ce que vous voulez:

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); 

Contenu de myosin.fasta après l'exécution du script:

Homo sapiens 
Homo sapiens 
Homo sapiens