Es que lo correcto es sacar el prepare fuera del bucle, ya que siempre es la misma "preparación", y hacer un execute en cada vuelta. El finish() sobra la mayoría de las veces (esto último lo dice el manual, no yo).
   
Código Perl:
Ver original- my $sth = $dbh->prepare('INSERT INTO inventarios values(?,?,?,?,?,?,?,?)') 
-     or die("Couldn't prepare statement: " . $dbh->errstr); 
- my @id; 
- my ($departamento, $categoria); 
- my @vars; 
- foreach ( @data_ ) { 
-     ($departamento, $categoria) = split q{.}, $id[6]; 
-     @vars = ($id[0], $departamento, $categoria, @id[2,1,4,3,5]); 
-     $sth->execute(@vars) or die("Couldn't execute statement: " . $sth->errstr); 
- } 
- $dbh->disconnect;