Mi sembra un errore di logica. Non e` che volevi scrivere questo?
codice:
while ($r = <IN> ) {
  $f = substr( $r, 3, 1);
  if ($f eq ".") {
    $r =~ s/\./;/;
  }
  print OUT $r;
}
Che puo` essere scritto:
codice:
while ($r = <IN> ) {
  $r =~ s/^(.{3})\.(.+)$/$1;$2/; 
  print OUT $r;
}
PS. Non ricordo se davanti al ; della seconda parte della RE, e` necessario un backslash