my $dbh = lazy_dbh( $dsn, $user, $pass, \%attr ); $dbh->()->ping(); sub lazy_dbh { my @args = @_; my $dbh; return sub { require DBI; if ( ! defined $dbh || ! $dbh->ping() ) { $dbh = DBI->connect( @args ) or die $DBI::errstr; } return $dbh; }; }