无法在未定义的值上调用方法“context”

时间:2015-01-19 15:12:06

标签: perl catalyst

当我编写以下代码时,我试图将子程序从一个控制器文件调用到另一个控制器文件:

Abc.pm这是我需要将代码调用到另一个控制器文件的代码的文件。我需要调用以下子程序。

package MyApp::Controller::Abc;
use Moose;
use IO::File;
use Data::Dumper;
use MyApp::MyConfig;
use MyApp::DateUtils;
use MyApp::Arrs::API;
use MyApp::Constants;
use namespace::autoclean;

sub get_token_id :Private
    {
    my $self = shift;
    my $c = $self->context;
    my $myDBI = $c->model('MyDBI')->new;
    return $myDBI->get_token_id;
    }

上面的代码我需要调用Def.pm文件。现在我打电话如下:

package MyApp::Controller::Def;
use Moose;
use namespace::autoclean;
use MyApp::Utils;

BEGIN { extends 'Catalyst::Controller'; }
my($self, $c) = @_;
my ($State, $Zip, $Country) = @_;
my $tokenid        = $self->get_token_id;

我收到以下错误: 无法在未定义的值上调用方法“get_token_id”

但我只需要打电话:

当我使用以下代码时:

package MyApp::Controller::Def;
use Moose;
use namespace::autoclean;
use MyApp::Utils;

BEGIN { extends 'Catalyst::Controller'; }
my $self = shift;
my $c = $self->context;
my ($State, $Zip, $Country) = @_;
my $coid        = $self->get_token_id;

我收到此错误: 无法在未定义的值上调用方法“上下文”

任何人都可以帮助我,为什么我会收到此错误。

提前致谢...

1 个答案:

答案 0 :(得分:1)

这里的根本原因似乎是您没有正确实例化对象。

使用:

$self = shift;

是一种面向对象的符号,如果你在一个子程序之外进行它是没有意义的 - 这似乎是在这里发生的。更具体地说 - 使用$object -> subname($some_parameter);作为方法调用的子程序。如果你这样做,那么perl将对象的引用传递给子例程的第一个参数 - 这就是:

sub my_method { 
    my $self = shift;
    $self -> {some_attribute} = 1;
    $self -> some_other_method(@args);
}

sub some_other_method { 
    my ( $self, @args ) = @_;
    foreach ( @args ) { 
         print;
    }
}

类型符号开始。

你没有这样做 - 你正在转移'在模块的主体中​​,它没有@_未定义,然后你试图在未定义的对象中调用context方法。因此错误。 get_token_id具有相同的根本原因。

我无法轻易提供有关如何解决问题的建议,因为很难确定您实际上想要做什么。我建议回顾一下OO perl是如何工作的,因为复习可能是有益的。