It is a common practice, although not always the best idea.
I often see $r or $ret (or @r, %r, @ret, %ret, etc) as the name of whatever variable will ultimately contain the value(s) to be returned.
Often, the variable should instead be named in a way that makes the name itself self-document its contents or its use. I cannot tell if this would be one of those cases.
Untested, equivalent code (just because I read via refactoring):
sub read_dt2 {
my ($path) = @_;
open my $IFH, '<', $path
or die "cannot open file '$path': $!";
my %mysterious_hash_keyed_by_nucleotide;
for my $nucleotide ( qw( A C G T ) ) {
local $_ = <$IFH>;
$mysterious_hash_keyed_by_nucleotide{$nucleotide} = [split];
}
close $IFH
or warn "cannot close file '$path': $!";
return \%mysterious_hash_keyed_by_nucleotide;
}