当我编写以下代码时,我试图将子程序从一个控制器文件调用到另一个控制器文件:
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;
我收到此错误: 无法在未定义的值上调用方法“上下文”
任何人都可以帮助我,为什么我会收到此错误。
提前致谢...
答案 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是如何工作的,因为复习可能是有益的。