Perl $ self在不同的潜艇中

时间:2017-02-01 09:14:26

标签: perl

我的Perl App

中有以下结构
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();
}

在sub" dbconnect"打开与数据库的连接。 所以现在我的问题是,我得到了错误"无法调用方法" functionToFetchRow()""

如果我这样做

$self->{'orcl'} = dbconnect();

在sub" anotherSub"它完美无缺。但我想只打开一次与数据库的连接,而不是在我需要它的每个Sub中打开。

所以我的错在这里?

1 个答案:

答案 0 :(得分:1)

  

无法调用方法" functionToFetchRow"在未定义的值

此错误消息告诉您$selfundef

您需要将$self传递给anotherSub,否则它无法了解相关信息。为此,请使用方法语法。

if($requestmethod eq 'POST') {
    my $testvar = $self->anotherSub();
}

Perl将自动传递$self作为anotherSub的第一个参数,如果它被调用的话。这就是在Perl中oject方向的工作原理。

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