in reply to While loop printing only one fasta header file

There is so much broken in that small code sample that I'd simply throw it away and start again.

For a start, if you need to check of existence of something you ought to be using a hash so put your header lines into a hash.

Next, never reread a file if you don't have to. The intent (although it fails in practice) of your while loop is to reread the input file for each header line you are looking for - way bad way to go! Instead make the while loop the outer loop so you read the large data file once only, then look up the hash in the body of the loop to see if you have a line you want to process.

You don't need to interpolate a variable into a string for it to be printed and if it's the default variable you don't need to specify it at all for print.

Ponder this somewhat cleaned up version:

use strict; use warnings; my $headerFile = <<DATA; >DFHGSUEIEEK >JKDHUEIEEOE >KDJIEEIOIEO DATA my $dataFile = <<DATA; >DFHGSUEIEEK ACGTCGTACGATCGATCAGTACGTACGAT >JKDHUEIEEOE ACGATGCGTACAGTACAGTACAGTACAGT >KDJIEEIOIEO AGTCGTCGTAGTGTTTTACCCCCATGTCA >HSKWJSSWWOW AGTAGTAGTAGTAGGGGTTTTTTTTACCC >ADJHFHIOHFO ACGTGGGGGGGGGGTTATTACCCCCCCCA >DTEEIJEJEOJE TTTTTTTTTTGGGGGGGGGACCCCCCCAT DATA open my $FD, '<', \$headerFile; my %headers = map {$_ => 0} <$FD>; close $FD; open my $FH, '<', \$dataFile; exists $headers{$_} and print while <$FH>; close $FH;

Prints:

>DFHGSUEIEEK >JKDHUEIEEOE >KDJIEEIOIEO

Perl reduces RSI - it saves typing