导入DBI模块的问题 - 在require中编译失败

时间:2011-02-19 15:18:29

标签: perl

  

可能重复:
  error of importing DBI in Perl

我在另一个模块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;
}

2 个答案:

答案 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数据库句柄并保护其他方法不使用它。最好不要使用'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返回真值,才能通过userequire成功加载:

  

文件必须返回true作为最后一条语句,表示任何初始化代码的成功执行,所以习惯上用1结束这样的文件;除非你确定否则它会恢复正常。但最好只放1; ,如果你添加更多的陈述。