$n=0;
open(DATA,"data.txt");
while(<DATA>){
if($_ =~ m/$keyword/){ $n+=1; $str .= "$_<br>"; }
}
close(DATA);
print "$n件見つかりました。<br><br>$str";


これじゃだめなのん?
オープン2回が気になるなら、seekで戻せば開きなおす必要はなし。