2012-05-14 28 views
2

我写了一个Perl模块:无法调用 “断开” 没有package..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"); 

,但它不工作。

错误消息:未定义子程序&主::称为在/var/www/domains/gabordx.tauri.hu/www/main.pl线查询7. - > “&查询(” SELECT * FROM用户“) ;”

有什么问题?

谢谢!

+0

请注意,所有小写模块名称[通常保留为pragmas](http://perldoc.perl.org/perlmodlib.html#Guidelines-for-Module-Creation)。另外,你不需要显式地导入DBD :: mysql,因为'DBI-> connect()'会为你加载正确的驱动程序。 – pilcrow

回答

1

需要导出Query为好,像这样:

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

否则你应该通过sql包来提及它,像这样

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

您可以直接调用它的前面加上模块名称:

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_OKhttp://perldoc.perl.org/Exporter.html#How-to-Export

相关问题