最終レスを保持している意味もよくわかんないなぁ。
配列の最後の要素は、$#ですぐにもってこれるし、要素数がそのままレス数なんだから、
わざわざカウンタ作る必要もないように思える
これでよくね?

my %res_db = ();
while(my $line = <FILE>) {
  # 省略
push @{$res_db}, { no => $res_no++, name => $name, mail => $mail,
date => $date, id => $id, be => $be, message => $message };
}
close FILE;

my $rank = 1;
foreach(sort { @$b <=> @$a } keys %res_db){
  my $ra = \@{$res_db{$_}};
  my $res = ${$ra}[$#{$ra}];
  print "$rank: ID:$$_{key}($$_{value}) 最新書き込み:>>$$res->{no} $$res->{date}\n";
  $rank++;
}