in reply to Compare hash with arrays and print

Perhaps something like this will do what you require UNTESTED:

my %hash = ( aw1 => 10, qs2 => 20, dd3 => 30, de4 => 10, hg5 => 30, dfd6 => 20, gf4 => 20, hgh5 => 30, hgy3 => 10, ); { # exchange number values for filehandles open my $FILE1, '>', '10.txt' or die "Cannot open '10.txt' $!"; open my $FILE2, '>', '20.txt' or die "Cannot open '20.txt' $!"; open my $FILE3, '>', '30.txt' or die "Cannot open '30.txt' $!"; for my $val ( values %hash ) { $val = $FILE1 if $val == 10; $val = $FILE2 if $val == 20; $val = $FILE3 if $val == 30; } } local @ARGV = glob 'Data/*.fa'; my $name; while ( my $line = <> ) { if ( $line =~ /^>(.+)/ ) { $name = $1; } print { $hash{ $name } } $_ if exists $hash{ $name }; }