Рассмотрите этот фрагмент своего кода:
while(<fh>) {
if ($filename=~ /(sshd)/){
$i++;
}
}
Вы действительно просматриваете строки файла, но продолжаете проверять, соответствует ли имя файла вашему регулярному выражению. Это явно не то, что вы намеревались.
Вы имели в виду:
while (my $line = <fh>) {
if ($line =~ /sshd/){
$i++;
}
}
Круглые скобки вокруг регулярного выражения кажутся излишними (они - мясо для захвата, а вы только соответствуете).
Поскольку выражение while (<fh>)
назначает содержимое строки специальной переменной $_
(которая является аргументом по умолчанию для сопоставления регулярному выражению), это можно сократить как:
while (<fh>) {
$i++ if /sshd/;
}