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 };
}