Not ignoring Corion's comments the do should be something like
my $id = $dbh->do(q{INSERT INTO person (id, first_name, last_name) val
+ues(?,?,?}, undef, undef, $first, $last});
that is, do($sql, undef, @bind_values). Also, notice I removed the trailing ';'. Also, I'm guessing your id field is actually auto generated for you by the database and a sequence or something in which case you can leave out the insert of the id entirely.
Also, your assignment to $id worries me as it will not be the id auto generated by the database.