문제

어떤 이유로 나는 DBI 손잡이로 어려움을 겪고 있습니다. 기본적으로 일어난 일은 PERL 모듈에서 특수 연결 기능을 만들고 수행에서 전환 한 것입니다.

do 'foo.pl'

에게

use Foo;

그리고 나는한다

$dbh = Foo->connect;

그리고 이제 어떤 이유로 나는 계속 오류를 얻습니다.

패키지 "foo"를 통해 객체 메소드 "롤백"을 찾을 수 없습니다.

따라서 이상한 점은 $ dbh가 분명히 foo가 아니라 Foo로 정의된다는 것입니다. 어쨌든, 나는 지금까지 문제가 없었습니다. 어떤 아이디어가 일어나고 있습니까?

편집하다: @axeman : connect 원본에는 존재하지 않았습니다. 우리가 다음과 같이 사용하는 문자열을 갖기 전에 다음과 같습니다.

do 'foo.pl';
$dbh = DBI->connect($DBConnectString);

그래서 connect 이와 같은 것입니다

sub connect {
    my $dbh = DBI->connect('blah');
    return $dbh;
}
도움이 되었습니까?

해결책

에서 perlfunc:

        do 'stat.pl';

    is just like

        eval `cat stat.pl`;

그래서 당신이 do 'foo.pl', 당신은 현재 컨텍스트에서 코드를 실행합니다. 무슨 일이 일어나고 있는지 모르기 때문입니다 foo.pl 또는 Foo.pm, 나는 당신에게 무엇이 바뀌 었는지 말할 수 없습니다. 그러나 나는 그것이 현재 상황에서 항상 실행되고 있으며 이제는 실행 중이라고 말할 수 있습니다. Foo:: 네임 스페이스.

당신이 이것을 부르는 방식, 당신은 지나가고 있습니다 'Foo' 첫 번째 매개 변수로 Foo::connect 또는 반환 된 서브에서 Foo->can('connect'). 어떻게 든 데이터베이스 핸들이라고 생각하는 일부 코드로 전달되는 것 같습니다. rollback.

다른 팁

FOO의 실제 코드를보고 이에 답할 수 있어야합니다. 당신은 아마 읽고 싶을 것입니다 DBI 서브 클래싱 문서에서 올바르게 수행하는 방법을 확인하십시오.

기본적으로 DBI 서브 클래스 DBI를 올바르게 (다시 문서를 읽어야 함) FOO가 필요하거나 DBI :: Connect 메소드에 올바르게 위임하기 위해 연결 기능을 선언해야합니다. 그러나 OO 코드를 위해 생산 래퍼를 작성하는 데주의하십시오. 그런 식으로 상태를 유지하는 것은 매우 어려워집니다.

나는 Axeman에 동의합니다. 당신은 아마도 당신의 기능을 사용하여 호출해야합니다

use Foo;
...
$dbh = Foo::connect();

foo-> connect () 대신;

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top