【问题标题】:Can't call method "disconnect" without a package..Perl没有包就不能调用方法“断开连接”..Perl
【发布时间】:2012-05-14 20:56:51
【问题描述】:

我写了一个 perl 模块:

package sql;
use strict;
use XML::Simple;
use DBI;
use DBD::mysql;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(DBImport DataFill);
our @EXPORT = qw(DBImport DataFill);

our $dbh;

sub DBConnect() {
    my $platform = "mysql";
    my $database = "databasename";
    my $host = "localhost";
    my $user = "user";
    my $pw = "password";
    my $dsn = "dbi:mysql:$database:localhost";
    $dbh = DBI->connect($dsn, $user, $pw);
    $dbh->do('SET NAMES utf8');
    return $dbh;
}

sub Query($) {
    my $sth = $dbh->prepare(shift);
    $sth->execute;
    while (my $ref = $sth->fetchrow_hashref()) {
        print $ref->{'email'};
    }
    $sth->finish();
}

BEGIN{
    $dbh = &DBConnect();
}

END{
    $dbh->disconnect();
}
1;

我试过用它:

#!/usr/bin/perl
use strict;
use CGI qw/:standard/;
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
use sql;

&Query("SELECT * FROM users");

但它不起作用。

错误消息:未定义的子例程 &main::Query 在 /var/www/domains/gabordx.tauri.hu/www/main.pl 第 7 行调用。 -> "&Query("SELECT * FROM users");"

有什么问题?

谢谢!

【问题讨论】:

  • 请注意,全小写的模块名称是usually reserved for pragmas。此外,您无需显式导入 DBD::mysql,因为DBI->connect() 将为您加载正确的驱动程序。

标签: perl module dbi


【解决方案1】:

您可以直接调用它,在模块名称前添加:

sql::Query("SELECT * FROM users");

或者你可以从模块中导入它

our @EXPORT_OK = qw(Query DBImport DataFill); # In the module

use sql qw(Query); # In caller code

或者你可以默认从sql.pm导出

our @EXPORT = qw(Query DBImport DataFill);

@EXPORT@EXPORT_OK 的参考:http://perldoc.perl.org/Exporter.html#How-to-Export

【讨论】:

    【解决方案2】:

    您还需要导出Query,如下所示:

    our @EXPORT_OK = qw(Query DBImport DataFill);
    our @EXPORT = qw(Query DBImport DataFill);
    

    否则你应该通过sql包引用它,像这样

    sql::Query("SELECT * FROM users");
    

    【讨论】:

      【解决方案3】:

      一种方法是导出函数:

      our @EXPORT = qw(DBImport DataFill Query);
      

      perldoc Exporter

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 2021-07-06
        • 2014-08-28
        • 2019-01-02
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多