2015-01-27 3 views
1

Я все еще в процессе изучения основных принципов 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. 

Это строка 22 от BigBrother.pm

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 } 

Очевидно, что я что-то упускаю. Может кто-то прояснить?

ответ

0

Эти две соответствующие строки:

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

Вы называете date и хранить его вывод в виде строки в скалярной переменной $start. Затем вы пытаетесь запустить метод startTimer на этом не-объекте. Это не работает, что совершенно правильно.

Вы определили метод startTimer где-нибудь или у вас есть модуль, который должен его предоставить?

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; 
}