Perl$self在不同的sub中

Perl$self在不同的sub中,perl,Perl,我的Perl应用程序中有以下结构 sub new { my $self = {}; $self->{'orcl'} = undef; $self->{'cgi'} = CGI->new(); bless $self; return $self; } sub getJ { my $self = shift; my $requestmethod = $se

我的Perl应用程序中有以下结构

sub new {                                   
    my $self = {};
    $self->{'orcl'} = undef;
    $self->{'cgi'} = CGI->new();
    bless $self;
    return $self;
}

sub getJ {
    my $self = shift;
    my $requestmethod = $self->{'cgi'}->request_method;
    $self->{'orcl'} = dbconnect();
    if($requestmethod eq 'POST') {
        my $testvar = anotherSub();
    }

sub anotherSub {
    my $self = shift;
    my $sth = $self->{'orcl'}->functionToFetchRow();
}
在子“dbconnect”中,打开与数据库的连接。 所以我现在的问题是,我得到了错误“不能调用方法”functionToFetchRow()

如果我这样做

$self->{'orcl'} = dbconnect();
在sub“anotherSub”中,它工作得非常完美。但是我只想打开一次与数据库的连接,而不是在我需要它的每一个子系统中

我的错在哪里

无法对未定义的值调用方法“functionToFetchRow”

此错误消息告诉您,
$self
undef

您需要将
$self
传递给
另一个子系统
,否则它不知道。为此,请使用方法语法

if($requestmethod eq 'POST') {
    my $testvar = $self->anotherSub();
}
Perl将自动将
$self
作为第一个参数传递给另一个子集
,如果它被这样调用的话。这就是在Perl中面向对象的工作方式


当您执行
$self->{'cgi'}->request_method
$self->{'orcl'}->functionToFetchRow()时,您已经在使用完全相同的东西了。在这两种情况下,
$self
(实际上只是一个散列引用)中的键都包含对象,
->方法
调用这些对象上的方法,将对象本身作为第一个参数传递。

getJ
末尾缺少一个花括号。向我们展示一些您实际看到问题的真实代码。此外,我怀疑您是否向我们提供了完整的错误消息(可能以未定义的值结尾)。您应该开始正确缩进代码。很难读。在同一个包中,似乎还混合了OOP代码和普通函数。如果在该包中定义了
sub-dbconnect
,则它应该是一个方法,也可以使用
$self
调用。如果导入了它,则不应导入它,而应使用包含包的完全限定名,否则它将在以后作为对象上的方法提供。你还应该在<代码>子新< /代码>中包含一个<代码> $类>代码>,但保持包名),然后将代码>祝福> /代码>到该类中,否则你将无法再子类。考虑发布你的实际完整代码(或者你觉得在互联网上公开共享的工作子集)。在Perl标记中,我们将向您提供有关您的风格的反馈,并告诉您如何改进代码。好的,谢谢。但这是我的全部代码。在子数据库连接中,我只做$self->{'orcl'}=AnotherPackage::orcl->new(schema,user,db,…),但是你帮了我很多。我想我现在更了解了如何编写PerlOOP。这对我来说有点难,因为我上一次是在2010年用php编程的,而不是OOP。simbabque你是我最后的英雄!它可以工作,在您的帮助下,我对Perl的理解更加深入!谢谢