【问题标题】:Can't call method "context" on an undefined value无法在未定义的值上调用方法“上下文”
【发布时间】:2015-01-22 19:59:46
【问题描述】:

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

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;

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

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

提前谢谢...

【问题讨论】:

  • 您需要use MyApp::Controller::Def; 某处吗?我无法找出 $c 的实例,因此倾向于假设您的代码中缺少某些内容。
  • @_ 包含子/方法的参数。加载模块时您正在访问它。为什么?!毫不奇怪,它是空的,因此您将 undef 分配给 $self
  • 更具体地说:以my 开头的四行看起来像是属于一个方法(在Perl 中是一种特殊的sub)。您根本没有在 sub 中使用它们。你在哪里找到他们?毫无疑问,您会注意到它们位于 sub 中。

标签: perl catalyst


【解决方案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 的工作原理,因为复习可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2017-05-18
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多