【问题标题】:Can't locate object method找不到对象方法
【发布时间】:2015-03-26 05:34:40
【问题描述】:

我仍在学习 OO Perl 的基本原理。 我创建了一个名为 BigBrother.pm 的包,其中包含一个基本构造函数。

package BigBrother;
use strict;
use warnings;

sub new {
    my ($class, $args) = @_;
    my $self = {
        datacenter => $args->{datacenter},
        testname   => $args->{testname},
        hostname   => $args->{hostname},
        ipaddress  => $args->{ipaddress},
        eventtime  => $args->{eventtime},
        responsetime  => $args->{responsetime},
        error         => $args->{error} || ''
    };
    return bless $self, $class;
}

我还创建了两种方法:一种记录事件开始前的时间,另一种记录事件停止的时间。

sub setTimer {
my $self = shift;
my $start = `date +%s.%N`;
$self->{startTimer} = $start->startTimer;
}

sub endTimer {
my $self = shift;
my $end = `date +%s.%N`;
return $self->{endTimer} = $end->endTimer;
}
1;

在我的 perl 可执行脚本中,我有以下内容:

#!/usr/bin/perl -w
use warnings;
use strict;
use Xymon::Plugin::Server::Hosts;
use lib "/usr/lib/xymon/server/ext";
use BigBrother;

BEGIN {
$ENV{LD_LIBRARY_PATH}= "/usr/lib/xymon/server/ext/";
}

my $bigbro = new BigBrother;
my $ret = $bigbro->setTimer;

但是当我运行脚本时出现以下错误:

# ./a.pl
Can't locate object method "startTimer" via package "1422368625.492495754
" (perhaps you forgot to load "1422368625.492495754
"?) at /usr/lib/xymon/server/ext/BigBrother.pm line 22.

这是BigBrother.pm的第22行

 sub setTimer {
 20     my $self = shift;
 21     my $start = `date +%s.%N`;
 22     $self->{startTimer} = $start->startTimer;
 23 }
 24
 25 sub endTimer {
 26     my $self = shift;
 27     my $end = `date +%s.%N`;
 28     $self->{endTimer} = $end->endTimer;
 29 }

显然,我错过了一些东西。有人可以澄清一下吗?

【问题讨论】:

    标签: perl oop


    【解决方案1】:
    my $start = `date +%s.%N`;
    

    上面在$start中存储了一个字符串(不是一个对象)。将您的子更改为:

    sub setTimer {
        my $self = shift;
        my $start = `date +%s.%N`;
        $self->{startTimer} = $start;
    }
    
    sub endTimer {
        my $self = shift;
        my $end = `date +%s.%N`;
        return $self->{endTimer} = $end;
    }
    

    【讨论】:

      【解决方案2】:

      这是两个相关的行:

      21     my $start = `date +%s.%N`;
      22     $self->{startTimer} = $start->startTimer;
      

      您调用date 并将其输出作为字符串存储在标量变量$start 中。然后你尝试在这个非对象上运行startTimer 方法。这不知道什么是完全正确的。

      您是否在某处定义了startTimer 方法,或者您是否有一些应该提供它的模块?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-06
        • 1970-01-01
        • 2014-03-22
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        相关资源
        最近更新 更多