Man muss ja nicht zwingend alles in SQL machen. Vernünftige Datenbankschnittstellen bieten auch Introspektion der verwendeten Namen an.
use DBI qw();
my $DB = 'mickymaus.sqlite';
my $TABLE = 'mickymaus';
my $dbh = DBI->connect("DBI:SQLite:db=$DB", undef, undef, {AutoCommit => 1, RaiseError => 1, sqlite_unicode => 1,});
$dbh->do("create table $TABLE (id text, fnord text)");
my %col = %{ $dbh->column_info(undef, undef, $TABLE, undef)->fetchall_hashref('COLUMN_NAME') };
$dbh->begin_work;
for my $pair (qw(id:foo id:bar id:quux fnord:23 fnord:42 fnord:fnord:fnord)) {
my ($col, $val) = split qr/:/, $pair, 2;
die "$col invalid" unless exists $col{$col};
$dbh->do("insert into $TABLE ($col) values (?)", {}, $val);
}
$dbh->commit;