per maggior correttezza scrivi:
$sth->finish();
A parte questo tieni presente che tu crei il puntatore $sth all'interno di un ciclo che finisce ovviamente quando la condizione posta è falsa, al contrario cerchi di usare il metodo finish fuori dal ciclo. Probabilmente all'uscita del ciclo $sth non esiste più (per esserne certi dovresti usare il debugger).
Dovresti inserire $sth->finish(); all'interno del ciclo prima dell'uscita in modo che si riferisca ad ogni puntatore $sth creato.
Ad ogni modo per quello che devi fare tu è molto meglio:
$dbh->do("LOCK TABLES dati WRITE");
while ($riga = <FILE> ) {
next if !($riga =~ /^\d\d\\s\d\\s\d\d\d\d/);
my @linea = split (" ", $riga);
my $data_ok = sprintf ("%04d-%02d-%02d %02d:%02d",$linea[2],$linea[1],$linea[0],$linea[3],$linea[4]);
$select_str = "INSERT INTO dati (CodStaz,CodSens,CodMarcaSens,Valore,DataOra,CodTi po,Serie) VALUES (\"$CodStaz\",\"1\",\"0\",\"$linea[5]\",\"$data_ok\",\"22\",\"1\")";
$dbh->do("$select_str");
}
$dbh->do("UNLOCK TABLES");
ricordandoti di eliminare anche l'istruzione $sth->finish();