首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl对象错误:无法通过我正在编写的类的包找到对象方法

Perl对象错误:无法通过我正在编写的类的包找到对象方法
EN

Stack Overflow用户
提问于 2015-04-10 17:12:09
回答 1查看 1.7K关注 0票数 1

在试图运行代码时,我会得到列出的错误。首先,我看了前面对类似问题的回答。This question 给出了最好的信息。它向我展示了如何看待正在装载的物品。

这是我的目录树:

  • 派格责任/
代码语言:javascript
复制
- Client.pm
- Obj.pm
- test/
代码语言:javascript
复制
    - pagerduty\_tester.pl

下面是测试人员当前的样子:

代码语言:javascript
复制
#!/usr/bin/env perl
use lib "../..";

use strict;
use warnings;
use YAML qw/LoadFile/;
use Pagerduty::Client;
use Pagerduty::Obj;
use Data::Dumper;

use constant TRUE  => 1;
use constant FALSE => 0;

print($INC{"Pagerduty/Obj.pm"}, "\n");

my $settings = LoadFile("pagerduty.yml");
my $client = Pagerduty::Client->new($settings);

sub create_test_incident{
    my $incident_params = define_test_incident();
    my $incident = $client->create_incident( $incident_params );

}

sub define_test_incident{
    {
        service_key => "<omitted>",
        description => "Test Incident",
        details => {
            detail1 => "Details blah",
            detail2 => "more detail",
        },
    }
}

my $obj = define_test_incident();
# print Dumper($obj);
print Dumper( Pagerduty::Obj->new( $obj ) );

# print Dumper( create_test_incident() )

这是Pagerduty::Obj

代码语言:javascript
复制
package Pageduty::Obj;

use strict;
use warnings;
use Data::Structure::Util qw/unbless/;

use constant TRUE => 1;

sub new{
    my $class = shift;
    my $self  = shift;
    # $self->{objCode} = lc($self->{objCode});
    return bless $self, $class;
}

sub serialize{
    my $self = shift;
    unbless($self);
}

sub update_values{
    my $self = shift;
    my $changes = shift;
    if($self->{changes}){
        while(my ($key, $value) = each $changes){
            $self->{changes}->{$key} = $value;
        }
    } else{
        $self->{changes} = $changes;
    }
}

TRUE;

最后,当我运行代码时,我得到以下内容:

代码语言:javascript
复制
../../Pagerduty/Obj.pm
Can't locate object method "new" via package "Pagerduty::Obj" (perhaps you forgot to load "Pagerduty::Obj"?)

当我禁止.././Pagerduty/Obj.pm时,我得到了上面列出的代码。这段代码位于我创建的一个库中。我把这个库放在变量PERL5LIB中。我有“使用库../.”因为我希望它能在任何电脑上工作。在过去的两天里,我一直在试图弄清楚为什么这个代码不起作用。有什么想法吗?

另一个类可以接受无法使用相同的错误消息创建新的Pagerduty::Obj。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 17:28:02

您的文件是Pagerduty/Obj.pm,您正在尝试使用类Pagerduty::Obj,但是在模块的顶部

代码语言:javascript
复制
package Pageduty::Obj;

这应该是

代码语言:javascript
复制
package Pagerduty::Obj;

顺便说一下,添加相对于脚本位置的包含目录的规范方法是使用FindBin,它为包含Perl程序文件的目录的绝对路径设置一个标量变量$FindBin::Bin (以及其他变量)。

代码语言:javascript
复制
use FindBin;
use lib "$FindBin::Bin/../..";

您可能听说过FindBin被破坏的消息,但最近在Perl 5的第16版中对其进行了更正。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29567073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档