0

我也有办法得到 dbConnect not defined 错误。我似乎找不到问题所在。dbConnect 是带有密码的硬编码。

#! perl


use strict;
use warnings;
use diagnostics;


use DBR qw(dbConnect query);

my $dbhead = dbConnect();
my $sql = "select * from mailing";
my @returned = query($dbhead,$sql);

该模块保存在名为 DB.pm 的保存目录中。我无法更改名称或内容。

package GUI::DB;

use strict;
use DBI;
use warnings;


use vars qw(@ISA @EXPORT);
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(dbConnect query);

#
# dbConnect - connect to the database, get the database handle
#
sub dbConnect {

    # Read database settings from config file:
    my $dsn = "DBI:mysql:database=test";
    my $dbh = DBI->connect( $dsn,
            'abc',
            'password',
                            { RaiseError => 1 } 
);

    return $dbh;

}

#
# query - execute a query with parameters
#       query($dbh, $sql, @bindValues)
#
sub query {
    my $dbh = shift;
    my $sql = shift;
    my @bindValues = @_;            # 0 or several parameters

    my @returnData = ();

    # issue query
    my $sth = $dbh->prepare($sql);

    if ( @bindValues ) {
            $sth->execute(@bindValues);
    } else {
            $sth->execute();
    }

    if ( $sql =~ m/^select/i ) {
            while ( my $row = $sth->fetchrow_hashref ) {
                    push @returnData, $row;
            }
    }

    # finish the sql statement
    $sth->finish();

    return @returnData;
}


__END__

我希望有人能看到我做错了什么。我知道模块中的子程序可以正常工作,因为如果我只是在模块底部编写代码并运行它,它就可以工作。

4

2 回答 2

0

好的,这有点乱... 让这个工作最不容易混淆的方法是找到 DBR.pm,创建一个 GUI 子目录(如果不存在的话),然后将 DBR.pm 移动到 GUI/DB 。下午。然后更改use DBRuse GUI::DB,您应该设置。

修复它的最简单方法是将您的use DBR行替换为:

use DBR;
GUI::DB->import(qw(dbConnect query));

...但这将继续让未来的维护者对DBR/GUI::DB不匹配感到困惑。

这里的问题use DBR相当于BEGIN { require DBR; DBR->import; },但文件package中的DBR.pm被命名GUI::DB,所以DBR->import什么都不做 - 它试图从错误的包中导入符号。import从正确的包(使用)手动调用GUI::DB->import将解决此问题,最好重命名模块文件(或更改该package文件中的名称),以便它遵循文件和包具有相同名称的标准约定它包含。

于 2013-10-22T08:25:42.710 回答
0

你需要

export PERL5LIB=.

在运行脚本之前

或者,将您的模块重命名为独特的名称

于 2013-10-22T04:54:36.157 回答