我在另一个模块script.pm
中使用DBI模块时遇到问题。
package CC;
use DBI;
use strict;
use Alias;
my $dbFile = 'XXXXXXXX.db';
my $db = DBI->connect("dbi:SQLite:$dbFile","","",
{RaiseError =>1, AutoCommit => 1})or "Unable to connect: $DBI::errstr\n";
use Alias qw(attr);
our ($CURRENTOFFSET,@LANGUAGE);
sub new {
my $that = shift;
my $class = ref($that)|| $that;
my $self = {
CURRENTOFFSET=> undef,
LANGUAGE => []
};
bless($self, $class);
return $self;
}
答案 0 :(得分:4)
传统上,包XYZ
保存在文件XYZ.pm
中;否则Perl将找不到您的包裹。因此,您的文件应为CC.pm
而不是script.pm
。
请注意,程序包Organization::Team::Purpose
保存在文件Purpose.pm
中,但该文件保存在子目录Organization/Team
中,并且保留Organization
的基目录必须可以通过Perl找到(如果-I/some/where
是目录Organization
的子目录,则使用/some/where
;如果它是当前目录的子目录,则会找到它反正)。
您应该在尝试连接后查看or
子句。通常,您在那里执行die
或croak
。您只需评估一个不太有用的字符串。
你有:
my $db = DBI->connect("dbi:SQLite:$dbFile","","",
{RaiseError =>1, AutoCommit => 1})or "Unable to connect: $DBI::errstr\n";
你应该考虑做什么,但有一种技巧是:
use Carp;
my $db = DBI->connect("dbi:SQLite:$dbFile", "", "",
{ RaiseError => 1, AutoCommit => 1 })
or croak "Unable to connect: $DBI::errstr\n";
这样做的缺点是这是进入一个模块,并且在模块的BEGIN代码中呱呱叫不一定是好主意(我假设代码是作为模块执行的已加载)。您可能需要存储undef
数据库句柄并保护其他方法不使用它。最好不要使用'connect to database'操作,直到使用构造函数new
(可能是第一次)。在这一点上提出错误至少是合法的。
正如DVK提到的答案(在我写答案之前),模块应该以{{1}}结束,表示成功加载。也许您可以利用它来报告加载失败时的错误 - 最终条件可能是'1;
'(或者甚至只是'defined $db ? 0 : 1;
'),但是以某种方式生成错误消息至关重要解释问题。
在操作员周围的间距也应该是无情的。您的示例包括:
defined $db;
哪个更好写成:
{RaiseError =>1, AutoCommit => 1}
my $class = ref($that)|| $that;
CURRENTOFFSET=> undef,
第一个可能会从更多的空间中受益:
{RaiseError => 1, AutoCommit => 1}
my $class = ref($that) || $that;
CURRENTOFFSET => undef,
它不会直接影响代码的运行。它确实使它不那么容易阅读。学会保持一致是学习编程的重要部分。
答案 1 :(得分:1)
根据这是一个包,并且您的代码示例不以“1;
”结尾这一事实来判断,请尝试在.pm文件中添加最后一行,如下所示:
1;
Perl模块必须在评估时通过do
返回真值,才能通过use
或require
成功加载:
文件必须返回true作为最后一条语句,表示任何初始化代码的成功执行,所以习惯上用1结束这样的文件;除非你确定否则它会恢复正常。但最好只放1; ,如果你添加更多的陈述。