By setting $/ appropriately, you could read in entire records, which would make your life somewhat easier.
Also, there is no need to iterate over all keys of the hash to then just pick the one where $key eq $name:
foreach my $key(keys %hash){
if($key eq $name){
if($hash{$key} == 10){
...
A direct lookup $hash{$name} would serve the same purpose.
Here's a simplified demo using __DATA__:
#!/usr/bin/perl
open (FILE1, ">10.txt") or die $!;
open (FILE2, ">20.txt") or die $!;
open (FILE3, ">30.txt") or die $!;
my %hash = (aw1 => 10, qs2 => 20, dd3 => 30,
de4 => 10, hg5 => 30, dfd6 => 20,
gf4 => 20, hgh5 => 30, hgy3 => 10);
{
local $/ = "\n>"; # input record separator
while (<DATA>){
s/^>//mg;
my ($name) = /^([^\n]+)/;
if($hash{$name} == 10){
select FILE1;
}
if($hash{$name} == 20){
select FILE2;
}
if($hash{$name} == 30){
select FILE3;
}
print ">$_";
}
}
__DATA__
>aw1
ATGCTAGATGCTAGCTAGCTAGCACTGAT
CGATGCTAGCGTAGTCAGCTGATGCTGTA
CGATGCTAGTCGTACG
>qs2
CGAGCTAGTCGTAGTCGTGATGCTGATTA
CGATGCTAGTCGTAGCTAGCTGATGCTGC
CGATGCTAGTCGTAGTC
>dd3
CGTAGTCGTAGTCGTAGTCGATGCTGATG
GCTAGTCGATGCTAGCTAGTCGATGCTGG
CGATGCTGAT
>de4
CGTAGTCGTAGTCGTACGTAGTCGTGAGT
CGATTATTTAGGAGGGACAAGGATAGTA
>hg5
CGTAGTCGTAGTCTAGTCGTGATGCTAGA
>dfd6
CGATGCTACGTACGTAGTCAGTCGTGATG
AATTAGAGCAGATAGAGGGGGAAAGGGTT
AAACCCC
>gf4
CGTAGTCAGTCTAGCTGATGTCGATGCTG
>hgh5
CATGCTAGTCGTAGTCGTAGTCGATGCTT
TTTTAAGGGAACCCCC
>hgy3
CCCCGGGTTTGGGAAAAGGGGGGGGATAG
(just re-add the looping over your @files)