Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Perl名称与CPAN冲突_Database_Perl_Module_Export - Fatal编程技术网

Database Perl名称与CPAN冲突

Database Perl名称与CPAN冲突,database,perl,module,export,Database,Perl,Module,Export,我还以多种方式获取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); 保存在

我还以多种方式获取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__
我希望有人能看出我做错了什么。我知道模块中的子例程工作正常,因为如果我只在模块底部编写代码并运行它,它就会工作。

您需要

export PERL5LIB=.
在运行脚本之前


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

好的,这有点混乱。。。最简单的方法是找到DBR.pm,创建一个GUI子目录(如果还没有),然后将DBR.pm移动到GUI/DB.pm。然后将
use DBR
更改为
use GUI::DB
,您应该进行设置

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

use DBR;
GUI::DB->import(qw(dbConnect query));
…但这将继续让未来的维护人员对
DBR
/
GUI::DB
不匹配感到困惑


这里的问题是
use DBR
相当于
BEGIN{require DBR;DBR->import;}
,但是
DBR.pm
文件中的
包名为
GUI::DB
,因此
DBR->import
不起任何作用-它试图从错误的包中导入符号。从正确的包中手动调用
import
(使用
GUI::DB->import
)将解决此问题,但最好重命名模块文件(或更改该文件中的
包的名称)因此,它将遵循标准约定,即文件及其包含的包的名称相同。

DB对于模块来说是一个非常糟糕的名称。DB不仅仅是CPAN中随机的东西;它是为perl调试器保留的名称空间。我认为在包DB中,perl中甚至有一些工作方式不同……您能显示DB.pm的前十几行吗?啊哈!您有一个名为“GUI::DB”的包。你需要把它放在一个名为
GUI
的目录中,这样它就可以被
use GUI::DB
加载。我在这里看到一个不匹配的地方:在
use
语句中,你使用的是
DBR
,但是模块的包是
GUI::DB
?我无法重命名或更改DB的内容。pm正在着手解决这个问题。我应该在哪里添加export Perl5lib?如何在其他名称下复制/符号链接DB.pm?