2011-02-19 41 views
-2

可能重复:
error of importing DBI in Perl问题 - 编译失败中需要

我有一个问题,当我使用DBI模块中的另一个模块,script.pm

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; 
} 
+5

什么问题?你有错误信息吗? – Nick

+1

请使用您的代码的代码块格式化您的问题。如果你不知道如何,就问。 – toolic

+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子句。通常,您在那里做diecroak。您只需评估一个字符串,这不是很有用。

您有:

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 } 

它不会直接影响操作的代码。它确实使它不那么容易阅读。学会一致是学习编程的重要组成部分。

1

的事实,这是一个包,你的代码示例不以“1;”,尝试将最后一行到你的.pm文件,如下所示结束判断:

1; 

Perl模块必须通过do评估后返回真值,可以通过userequire成功加载:

文件必须返回作为最后的真实表示成功执行任何初始化代码,所以通常以1结束这样的文件;除非你确定它否则会返回true。但是最好放1; ,以防你添加更多的语句。