in reply to Re: While loop with nested if statements
in thread While loop with nested if statements

I've added an example of the input and output to my original post, and my code is currently looking like this, but again I am still not sure I am using the hash correctly, and the hash key is really throwing me. I'm not getting any errors with this code, but my output file is empty

#!/usr/bin/perl use warnings; use strict; use diagnostics; open( INFILE, "<", 'myosin.fasta') or die $!; #open original myosin.fa +sta for reading open( OUTFILE, ">", 'modifiedHeaders.fasta') or die $!; #open/create n +ew fasta for writing my %headerHash; #create hash for the header my $seq; my $header; #loop through old file while (<INFILE>){ chomp; my $line = $_; # use if/then to seperate headers from seq, while regex to select only + species name in header if ($line =~ /^>/){ $header = $line; if ($header =~ /(>gi.*)\[(.+)\](>g.*)\[(.+)\]/ +){ my $headerHash = $2; $headerHash{$2} = $2; } } else { $seq = $line; } } close INFILE; for my $key(keys %headerHash){ print OUTFILE $headerHash{$key}, "\n", $seq, "\n"; }

Replies are listed 'Best First'.
Re^3: While loop with nested if statements
by Marshall (Canon) on Apr 03, 2016 at 18:00 UTC
    I still see multiple problems. Can you show what you expect the output lines to be? I guess there is some input now on the OP. I get now:
    Global symbol "$headerHash" requires explicit package name at C:\Proje +cts_Perl\anotherfastathing.pl line 30. Execution of C:\Projects_Perl\anotherfastathing.pl aborted due to comp +ilation errors (#1) (F) You've said "use strict" or "use strict vars", which indicates + that all variables must either be lexically scoped (using "my" or +"state"), declared beforehand using "our", or explicitly qualified to say which package the global variable is in (using "::"). Uncaught exception from user code: Global symbol "$headerHash" requires explicit package name at C:\P +rojects_Perl\anotherfastathing.pl line 30. Execution of C:\Projects_Perl\anotherfastathing.pl aborted due to +compilation errors. Process completed with exit code 255
    Update: Ok, this looks like what you want, why not?
    #!/usr/bin/perl use warnings; use strict; use diagnostics; my $firstline = <DATA>; my ($species) = $firstline =~ /\[(.+?)\]/; print "$species\n"; while (<DATA>) {print;} =Prints: Homo sapiens MSSDSEMAIFGEAAPFLRKSERERIEAQNKPFDAKTSVFVVDPKESFVKATVQSREGGKVTAKTEAGATV +TVKDDQVFPM NPPKYDKIEDMAMMTHLHEPAVLYNLKERYAAWMIYTYSGLFCVTVNPYKWLPVYNAEVVTAYRGKKRQE +APPHIFSISD NAYQFMLTDRENQSILITGESGAGKTVNTKRVIQYFATIAVTGEKKKEEVTSGKMQGTLEDQIISANPLL +EAFGNAKTVR NDNSSRFGKFIRIHFGTTGKLASADIETYLLEKSRVTFQLKAERSYHIFYQIMSNKKPDLIEMLLITTNP +YDYAFVSQGE ITVPSIDDQEELMATDSAIEILGFTSDERVSIYKLTGAVMHYGNMKFKQKQREEQAEPDGTEVADKAAYL +QNLNSADLLK ALCYPRVKVGNEYVTKGQTVQQVYNAVGALAKAVYDKMFLWMVTRINQQLDTKQPRQYFIGVLDIAGFEI +FDFNSLEQLC INFTNEKLQQFFNHHMFVLEQEEYKKEGIEWTFIDFGMDLAACIELIEKPMGIFSILEEECMFPKATDTS +FKNKLYEQHL GKSNNFQKPKPAKGKPEAHFSLIHYAGTVDYNIAGWLDKNKDPLNETVVGLYQKSAMKTLALLFVGATGA +EAEAGGGKKG GKKKGSSFQTVSALFRENLNKLMTNLRSTHPHFVRCIIPNETKTPGAMEHELVLHQLRCNGVLEGIRICR +KGFPSRILYA =cut __DATA__ >gi|115527082|ref|NP_005954.3| myosin-1 [Homo sapiens] >gi|226694176|s +p|P12882.3|MYH1_HUMAN RecName: Full=Myosin-1; AltName: Full=Myosin he +avy chain 1; AltName: Full=Myosin heavy chain 2x; Short=MyHC-2x; AltN +ame: Full=Myosin heavy chain IIx/d; Short=MyHC-IIx/d; AltName: Full=M +yosin heavy chain, skeletal muscle, adult 1 [Homo sapiens] >gi|119610 +411|gb|EAW90005.1| hCG1986604, isoform CRA_b MSSDSEMAIFGEAAPFLRKSERERIEAQNKPFDAKTSVFVVDPKESFVKATVQSREGGKVTAKTEAGATV +TVKDDQVFPM NPPKYDKIEDMAMMTHLHEPAVLYNLKERYAAWMIYTYSGLFCVTVNPYKWLPVYNAEVVTAYRGKKRQE +APPHIFSISD NAYQFMLTDRENQSILITGESGAGKTVNTKRVIQYFATIAVTGEKKKEEVTSGKMQGTLEDQIISANPLL +EAFGNAKTVR NDNSSRFGKFIRIHFGTTGKLASADIETYLLEKSRVTFQLKAERSYHIFYQIMSNKKPDLIEMLLITTNP +YDYAFVSQGE ITVPSIDDQEELMATDSAIEILGFTSDERVSIYKLTGAVMHYGNMKFKQKQREEQAEPDGTEVADKAAYL +QNLNSADLLK ALCYPRVKVGNEYVTKGQTVQQVYNAVGALAKAVYDKMFLWMVTRINQQLDTKQPRQYFIGVLDIAGFEI +FDFNSLEQLC INFTNEKLQQFFNHHMFVLEQEEYKKEGIEWTFIDFGMDLAACIELIEKPMGIFSILEEECMFPKATDTS +FKNKLYEQHL GKSNNFQKPKPAKGKPEAHFSLIHYAGTVDYNIAGWLDKNKDPLNETVVGLYQKSAMKTLALLFVGATGA +EAEAGGGKKG GKKKGSSFQTVSALFRENLNKLMTNLRSTHPHFVRCIIPNETKTPGAMEHELVLHQLRCNGVLEGIRICR +KGFPSRILYA
      #!/usr/bin/perl-w use strict; use warnings; my %hash=(); my $key = ''; while(<>){ chomp; if($_ =~ /^>gi.*\[(.+)\]\s>gi.*/){ $key = $1; }else{ $hash{$key} .= $_; } } foreach(keys %hash){ print join("\n",$_,$hash{$_}),"\n"; }
      This does what you need