出于某种原因,我遇到了DBI句柄的麻烦。基本上发生的事情是我在perl模块中创建了一个特殊的连接函数,并从执行:
切换do 'foo.pl'
到
use Foo;
然后我做
$dbh = Foo->connect;
现在由于某种原因我不断收到错误:
无法在../Foo.pm第171行通过包“Foo”找到对象方法“rollback”。
所以奇怪的是$ dbh肯定不是Foo,它只是在foo中定义的。无论如何,到目前为止我还没有遇到任何麻烦。有什么想法吗?
编辑:@Axeman:connect
在原始版本中不存在。在我们使用之前我们使用的字符串之前:
do 'foo.pl';
$dbh = DBI->connect($DBConnectString);
所以connect
就是这样的
sub connect {
my $dbh = DBI->connect('blah');
return $dbh;
}
答案 0 :(得分:7)
我们需要看到Foo中的实际代码能够回答这个问题。您可能希望阅读文档中的Subclassing the DBI以了解如何正确执行此操作。
基本上,你要么需要Foo来正确地继承DBI(再次,你需要阅读文档),或者你需要声明一个connect函数来正确委托给DBI :: connect方法。但要注意为OO代码编写一个产品包装器。以这种方式维持状态变得非常困难。
答案 1 :(得分:4)
来自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
。
答案 2 :(得分:3)
我同意Axeman。您可能应该使用
调用您的函数use Foo;
...
$dbh = Foo::connect();
而不是Foo-> connect();