in reply to Re^4: fasta hash
in thread fasta hash

Sadly you ignored half of my advice; it wasn't given without reason. Please reconsider your position.

You print can only be executed once because it's not inside a loop (should be inside the while loop). Proper indention would have made that obvious, and use strict would have told you that $fasta isn't in scope in the if (exists $fastahash{$fasta}) (if you would have declared it properly inside the while loop).

Replies are listed 'Best First'.
Re^6: fasta hash
by morio56 (Initiate) on Aug 26, 2011 at 19:10 UTC

    Thanks for your help, but non of this things work even if i follow your instructions to the letter. Putting the if loop within the while loop only prints the ids and no sequences. Putting it in the big while loop prints several lines repeatedly

      Instead of processing the second file line by line, it is possible to use the '>' character as an end-of-line input separator. This simplifies processing of the file.
      #!/usr/bin/perl -w use strict; open (IDS, '<', "fastaIds") or #with your data 2056360012 2056360013 die "cannot open fastaIds $!\n"; #-------------# my %ids; while (<IDS>) #process first file with only ID's { chomp; $ids{$_}=1; } #-------------# $/='>'; #input record separator is now '>' while (<DATA>) { chomp; # now works on '>' not \n next if /^\s*$/; # first record will be blank my ($id) = /^\s*(\d+)/; print ">$_" if $ids{$id}; #print all lines for this id } #-------------# =prints > 2056360012 1047627436237 yyyacgagchagshgashcgahcgac acsasasasacsacsasasacaca ascassacsaascascascascac > 2056360013 1047627436238 xxxxcgagchagshgashcgahcgac acsasasasacsacsasasacaca ascassacsaascascascascac =cut __DATA__ > 2056360012 1047627436237 yyyacgagchagshgashcgahcgac acsasasasacsacsasasacaca ascassacsaascascascascac > 2056360013 1047627436238 xxxxcgagchagshgashcgahcgac acsasasasacsacsasasacaca ascassacsaascascascascac