Perl objects error: Can't locate object method via package for class I'm writing
Perl objects error: Can't locate object method via package for class I'm writing
我在尝试 运行 编码时遇到了列出的错误。我首先查看了以前对类似问题的回答。 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 ../..' 行,因为我希望它可以在任何计算机上运行。在过去的两天里,我一直在试图弄清楚为什么这段代码不起作用。有什么想法吗?
其他 class 作品接受无法创建新的 Pagerduty::Obj 并出现相同的错误消息。
您的文件是 Pagerduty/Obj.pm
,您正在尝试使用 class Pagerduty::Obj
,但在模块的顶部您有
package Pageduty::Obj;
应该是
package Pagerduty::Obj;
顺便说一下,添加相对于脚本位置的包含目录的规范方法是使用 FindBin
,它将标量变量 $FindBin::Bin
(以及其他)设置为绝对路径到包含 Perl 程序文件的目录。
use FindBin;
use lib "$FindBin::Bin/../..";
您可能听说过 FindBin
被破坏,但最近在 Perl 5 的第 16 版中已得到纠正。
我在尝试 运行 编码时遇到了列出的错误。我首先查看了以前对类似问题的回答。 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 ../..' 行,因为我希望它可以在任何计算机上运行。在过去的两天里,我一直在试图弄清楚为什么这段代码不起作用。有什么想法吗?
其他 class 作品接受无法创建新的 Pagerduty::Obj 并出现相同的错误消息。
您的文件是 Pagerduty/Obj.pm
,您正在尝试使用 class Pagerduty::Obj
,但在模块的顶部您有
package Pageduty::Obj;
应该是
package Pagerduty::Obj;
顺便说一下,添加相对于脚本位置的包含目录的规范方法是使用 FindBin
,它将标量变量 $FindBin::Bin
(以及其他)设置为绝对路径到包含 Perl 程序文件的目录。
use FindBin;
use lib "$FindBin::Bin/../..";
您可能听说过 FindBin
被破坏,但最近在 Perl 5 的第 16 版中已得到纠正。