我有一个没有数据库连接的大脚本。我需要一个用于一个小小的新功能。在我需要的地方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
隐藏在程序的其余部分。
答案 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}}自动创建一个。依赖注入很好,但这并不意味着你需要强制更高级别来创建你需要的东西。