【问题标题】:Perl objects error: Can't locate object method via package for class I'm writingPerl 对象错误:无法通过我正在编写的类的包找到对象方法
【发布时间】:2015-04-10 17:12:09
【问题描述】:

我在尝试运行代码时遇到了列出的错误。我首先查看了类似问题的先前答案。 This question 提供了最好的信息。它向我展示了如何查看正在加载的项目。

这是我的目录树:

  • Pagerduty/

    • Client.pm

    • Obj.pm

    • 测试/

      • pagerduty_tester.pl

这是测试仪当前的样子:

#!/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

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;

最后,当我运行代码时,我得到以下信息:

../../Pagerduty/Obj.pm
Can't locate object method "new" via package "Pagerduty::Obj" (perhaps you forgot to load "Pagerduty::Obj"?)

当我 cat ../../Pagerduty/Obj.pm 时,我得到上面列出的代码。此代码位于我创建的库中。我将该库放在变量 PERL5LIB 中。我有 'use lib ../..' 行,因为我希望它可以在任何计算机上工作。在过去的两天里,我一直在试图弄清楚为什么这段代码不起作用。有什么想法吗?

其他类作品接受无法创建具有相同错误消息的新 Pagerduty::Obj。

【问题讨论】:

    标签: perl oop perl-module


    【解决方案1】:

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

    package Pageduty::Obj;
    

    应该是

    package Pagerduty::Obj;
    

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

    use FindBin;
    use lib "$FindBin::Bin/../..";
    

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

    【讨论】:

    • 太棒了!我还没有听说过 FindBin,所以谢谢你。还有,哇!我觉得很傻。谢谢:-)
    猜你喜欢
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多