我可以安全地要求Perl';使用DBI而不是使用它?

我可以安全地要求Perl';使用DBI而不是使用它?,perl,dbi,Perl,Dbi,我有一个大型脚本,它还没有数据库连接。我需要一个小的新功能。将裸块添加到我需要的require DBI位置安全吗?还是需要导入某些内容 # Lots of no-database code here... my $obj; { require DBI; my $dbh = DBI->connect('dsn'); $obj = ModuleThatNeedsDBH->new(dbh => $dbh); } $obj->fancyStuff(); # More

我有一个大型脚本,它还没有数据库连接。我需要一个小的新功能。将裸块添加到我需要的
require DBI
位置安全吗?还是需要导入某些内容

# Lots of no-database code here...
my $obj;
{
  require DBI;
  my $dbh = DBI->connect('dsn');
  $obj = ModuleThatNeedsDBH->new(dbh => $dbh);
}
$obj->fancyStuff();
# More no-database code...

当然,该块将使
$dbh
对程序的其余部分隐藏。

默认情况下,
DBI
模块不会将任何内容导入调用包中,因此是的,理论上您可以使用
require
而不是
use

但是你希望从中得到什么呢?在这种情况下,
use DBI
相当于
BEGIN{require DBI}
,如果省略
BEGIN
块,将在运行时强制执行加载包的漫长过程,这是不可取的

请注意,您还必须处理连接到数据库的任何故障

my $dbh = DBI->connect('dsn', 'user', 'pass')
            or die $DBI::errstr;

尽管死亡在您的情况下可能有点极端。

尽管默认情况下DBI不导入任何内容,但这并不意味着在您使用它时它不进行任何内部处理或设置。除非模块的文档中另有说明,否则您应该使用整个过程来确保所有应该发生的事情都实际发生。你可能想看看


也可以考虑,如果不在参数列表中进行,请考虑编写<代码> MultStudioNoDSDBH <代码>自动生成一个。依赖注入很好,但这并不意味着你需要强制更高的级别来创建你需要的东西。

如果加载
DBI
的功能不经常使用,这是非常可取的。它只会在50次调用中使用1次。运行一次程序需要几分钟。这是一个创建大量文件的cronjob。我不介意它是否会让运行时慢一次,但我不喜欢每次都包含它,因为它不是必需的。@mob:我不买它
DBI
使用的数据量小于1兆字节,默认情况下不会污染本地名称空间。这取决于应用程序,但我通常更喜欢在第一次需要DB句柄时使用边际占用而不是延长响应时间。@simbabque:这是你的要求,但我认为你毫无理由地过于复杂化了benefit@Borodin:可能是这样。不过,很高兴知道,不是吗?谢谢。简单的解决方案往往是最难想出的。