ファイル名のリストから数字の付いていないものをみつけ出し、それらのファイル名に数字の付いたものを出力しようとしました。
期待する出力は

aa
aa86.txt
ww
ww873.txt
q
q12.txt

なのですが実際は

aa
ww
q

となります。どこが悪いのかご教示ください。

ソース:
use utf8;
@f = ("aa.txt","aa86.txt","fff73.txt","ww.txt","ww873.txt","q.txt","q12.txt","mm55.txt",
"gg21.txt",);
@nn = grep(/^\D+$/, @f);
foreach $nn(@nn){
$nn =~ s/\.txt//;
print "$nn\n";
@n = grep(/^$nn\d+$/, @f);
print join("\n", @n);
}