实质性
常规地,封装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
数据库句柄并保护其他方法不使用它。在使用构造函数new
(可能是第一次)之前,延迟“连接到数据库”操作可能会更好。在这一点上提出错误至少是合法的。
正如DVK指出的答案(在我写我的答案之前),模块应以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,
第一个可以从多一点空间中受益:
{ RaiseError => 1, AutoCommit => 1 }
它不会直接影响操作的代码。它确实使它不那么容易阅读。学会一致是学习编程的重要组成部分。
什么问题?你有错误信息吗? – Nick
请使用您的代码的代码块格式化您的问题。如果你不知道如何,就问。 – toolic
这是昨天的问题的扩展版本 - 它比昨天的问题更好,因为它包括一些批评的代码,但没有很好的解释问题是什么。 –