2

我有一个尚未连接数据库的大型脚本。我需要一个用于一个微小的新功能。在我需要的地方添加一个裸块是否安全,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该块当然是对程序的其余部分保持隐藏。

4

2 回答 2

3

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

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

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

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

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

于 2012-07-02T15:41:04.790 回答
2

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

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

于 2012-07-02T20:51:10.540 回答