按照这里的指南,我想在我的perl代码中放置一个DBI连接处理子程序.我认为该BEGIN块是一个合理的位置,所以如果我遇到DBI连接问题,它将在移动剩余(这是相当长的)之前失败.
BEGIN {
my $dbh;
use constant {
my_host => 'database=MYDB;host=MYHOST',
my_user => 'USER',
my_pass => 'PASSWORD'
};
sub get_db_handle {
unless (defined ($dbh)) {
my $dbh = DBI->connect(
('DBI:mysql:' . my_host),
my_user, my_pass,
{PrintError => 0, AutoCommit => 0}
) or die $DBI::errstr;
}
return $dbh;
}
}
...
# Everything works fine without it being in the BEGIN
my $db = get_db_handle();
my $sth = $db->prepare($sql);
Run Code Online (Sandbox Code Playgroud)
运行时,我得到预期的错误:
无法在未定义的值上调用方法"prepare"
为了解决这个问题,我在声明use constant值后立即运行DBI连接字符串并且它正常工作,但这似乎不是最好的方法,并且作者没有发布有关此实现的任何其他信息.
是否有一个典型的用法说明这种方法,创建DBI处理程序和一个子来传递我应该研究的脚本,或者是否有更好的方法来defined允许我使用上述方法的语句?
删除2-nd my $dbh:
sub get_db_handle {
unless (defined ($dbh)) {
$dbh = DBI->connect(# <- no "my" here
('DBI:mysql:' . my_host),
my_user, my_pass,
{PrintError => 0, AutoCommit => 0}
) or die $DBI::errstr;
}
Run Code Online (Sandbox Code Playgroud)