2013-10-22 6 views
0

또한 dbConnect가 정의되지 않은 오류가 발생합니다. 문제를 찾을 수없는 것 같습니다. dbConnect는 암호가있는 하드 코드입니다.Perl 이름과 CPAN이 일치하지 않습니다.

#! 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__ 

나는 누군가 내가 잘못하고있는 곳을 볼 수 있기를 바라고 있습니다. 나는 모듈의 서브 루틴이 제대로 작동한다는 것을 알고있다. 모듈의 맨 아래에 코드를 작성하고 실행하면된다.

+6

DB는 모듈에 대해 매우 나쁜 이름입니다. DB는 CPAN의 일부 무작위적인 것이 아닙니다. Perl 디버거를 위해 예약 된 네임 스페이스입니다. – hobbs

+0

패키지 DB에서 펄에서 다르게 작동하는 몇 가지 사항이 있다고 생각합니다. – ysth

+0

DB.pm의 처음 12 줄 정도를 표시 할 수 있습니까? – ysth

답변

0

당신은

또는 스크립트를 실행하기 전에

export PERL5LIB=. 

필요,

+0

DB.pm의 내용을 바꿀 수 없으며 변경할 수 없습니다. 해결 방법은 없습니다. 어디에서 다른 이름으로 DB.pm을 복사/심볼릭 링크하는 방법에 대해 PERL5LIB – user2808458

+0

내보내기를 추가해야합니까? – mirod

0

OK 독특한 뭔가 모듈의 이름을 변경,이 ... 최소 혼란 방법에 지저분한입니다 이 작업을하려면 DBR.pm을 찾고, GUI 하위 디렉토리를 생성하고 (이미 존재하지 않는 경우) DBR.pm을 GUI/DB.pm으로 이동하십시오. 그런 다음 use DBRuse GUI::DB으로 변경하면 설정해야합니다.

이 당신의 use DBR 라인을 대체하는 것입니다 해결하는 가장 쉬운 방법 :

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

...하지만이 DBR/GUI::DB 불일치 혼란 미래 테이너를 떠날 것입니다. 여기

문제는 use DBRBEGIN { require DBR; DBR->import; }에 해당한다는 것입니다,하지만 DBR.pm 파일의 package 그래서 DBR->import 아무것도 않습니다 GUI::DB라는 - 잘못된 패키지에서 문자를 가져올 시도하지 것. 올바른 패키지 (GUI::DB->import)에서 import을 수동으로 호출하면 이지만 모듈 파일의 이름을 바꾸거나 (해당 파일의 package 이름을 변경하는 것이 좋습니다) 두 파일에 동일한 이름을 갖는 표준 규칙을 따르는 것이 좋습니다 파일과 패키지에 들어 있습니다.

관련 문제