가이드 here에 따라 perl
코드에 DBI 연결 처리 서브 루틴을 배치하려고했습니다. 내가 블록을 넣을 수있는 합리적인 장소라고 생각했기 때문에 내가 나중에 DBI
연결에 문제가 생기면 남은 부분 (오히려 길다)을 통과하기 전에 실패 할 것이다. 실행 그러나 내가 예상되는 오류 얻을 때BEGIN 블록의 DBI 연결 및 정의되지 않은 값
BEGIN {
my $dbh;
use constant {
my_host => 'database=MYDB;host=MYHOST',
my_user => 'USER',
my_pass => 'PASSWORD'
};
sub get_db_handle {
unless (defined ($dbh)) {
my $dbh = DBI->connect(
('DBI:mysql:' . my_host),
my_user, my_pass,
{PrintError => 0, AutoCommit => 0}
) or die $DBI::errstr;
}
return $dbh;
}
}
...
# Everything works fine without it being in the BEGIN
my $db = get_db_handle();
my $sth = $db->prepare($sql);
는 :
Can't call method "prepare" on an undefined value
이 해결하기 위해이 나는 DBI 바로 use constant
값을 선언 한 후 연결 문자열 실행하고 작동하지만,이하지 않는 것 최선의 접근 방식이며 저자는이 구현에 대한 추가 정보를 게시하지 않았습니다.
DBI 처리기와 하위 처리기를 만들어서 살펴 봐야 할 일반적인 방법이 있습니까? 아니면 위의 사용을 허용하는 defined
문에 대한 더 나은 접근법이 있습니까? 방법?
언급 한 오류 외에도 실제로 당신이 BEGIN에 연결하려고 시도했지만 의미가 없다고 생각합니다. – ikegami
Yup은 BEGIN 중에 연결하지만 가능한 경우 get_db_handle을 사용합니다. – MattSizzle
왜 파일 맨위가 아닌'BEGIN' 블록에'get_db_handle'을 선언하고 싶은지 모르겠습니다. 연결 시도는 서브 루틴 호출시에만 계속됩니다. – Borodin