$DSN= 'dbi:DriverName:database=$db;host=$host;port=$port;'
This won't work as you want. See
Quote and Quote-like Operators in perlop.
Generally, it's a good idea to add
print statements as per Corion's
advice. Not only for the DSN, also later for SQL statements. Instead of
$sth = $dbh->do('SELECT whatever ...');
it's better do write
my $sql = 'SELECT whatever ...';
print "Statement: [$sql\n]";
$sth = $dbh->do($sql);
I myself prefer
use Data::Dumper;
...
my $sql = 'SELECT whatever ...';
print Dumper $sql;
my $sth = $dbh->prepare($sql) or die "prepare failed: ', $DBI::errstr;
...
because if I have a reference somewhere, I see directly what that points to.