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

时间:2012-07-02 15:31:51

标签: 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 no-database code...

当然,阻止$dbh隐藏在程序的其余部分。

2 个答案:

答案 0 :(得分:3)

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

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

请注意,您还必须处理连接到数据库的任何失败。

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

虽然在你的情况下死亡可能有点极端。

答案 1 :(得分:2)

虽然默认情况下DBI不会导入任何内容,但这并不意味着它在您使用它时不会进行任何内部处理或设置。除非模块的文档另有说明,否则您应该使用完整的过程来确保实际应该发生的一切。您可能希望看到How can I dynamically include Perl modules without using eval?

另外,如果ModuleThatNeedsDBH没有在其参数列表中出现,我会考虑让{{1}}自动创建一个。依赖注入很好,但这并不意味着你需要强制更高级别来创建你需要的东西。