in reply to duplicate key check isn't, why not?

I don't know whether you've fully solved your problem by now, but just in terms of understanding the error message, this part:
Use of uninitialized value in concatenation (.) or string at parse_vot +er_list.pl line 251
happened because of this logic in your code ("execute" call simplified for legibility):
if(!defined($mlg_addr_id) && length($fields[20]) == 2){ $sth_insert_mlg_addr->execute(@fields[17..23]) or warn "While inserting new mailing address |$fields[17]|; |$ +fields[19]| |$fields[20]|, with id |$mlg_addr_id|: " . $dbh->errstr;
Note how you are including $mlg_addr_id in your error message, specifically on condition that it happens to be undefined. What's the point of that, and how does the undefined variable relate to the "insert_mlg_addr" query being executed in this condition?

I'm not sure I can comment coherently on the rest of your details, but if you haven't heard about "ON DUPLICATE KEY UPDATE ...", you might want to look that up, just in case it's relevant.