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();