BEGIN块中的DBI连接和未定义的值

Mat*_*zle 1 perl dbi

按照这里的指南,我想在我的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允许我使用上述方法的语句?

use*_*035 5

删除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)