Perl sub не хочет работать с переданными объектами как параметрами - PullRequest
0 голосов
/ 16 февраля 2012

Я передаю два Date::Manip::Date объекта, совершенно правильные даты для моего подпрограммы:

sub get_duration {
        my $duration;
        my @val;

        my $from = $_[0]->new_date();
        my $to = $_[1]->new_date();
    #   $from->parse("2012-03-06");
    #   $to->parse("2012-03-07");

        print $from . " ".$to. "<-- <br />";

        my @f = $from->value();
        if ($f[0] == 2012) {
            $from->config("ConfigFile",$HOLIDAYS_2012);
        } elsif ($f[0] == 2013) {
            $from->config("ConfigFile",$HOLIDAYS_2013);
        } elsif ($f[0] == 2014) {
            $from->config("ConfigFile",$HOLIDAYS_2014);
        } elsif ($f[0] == 2015) {
            $from->config("ConfigFile",$HOLIDAYS_2015);
        }
        my @t = $to->value();
        if ($t[0] == 2012) {
            $to->config("ConfigFile",$HOLIDAYS_2012);
        } elsif ($t[0] == 2013) {
            $to->config("ConfigFile",$HOLIDAYS_2013);
        } elsif ($t[0] == 2014) {
            $to->config("ConfigFile",$HOLIDAYS_2014);
        } elsif ($t[0] == 2015) {
            $to->config("ConfigFile",$HOLIDAYS_2015);
        }

        print "from " . @f ." to ". @t."<br>";

        my $delta = $from->calc($to, "business");
        print $from->calc($to, "business") . " <-";

        @val = $delta->value();

        if ($to->is_business_day()) {
            $duration = $val[3]+1;
        } else {
            $duration = $val[3];
        }

        return $duration;
    }

Я получаю вывод

Date::Manip::Date=HASH(0xacdf7a0) Date::Manip::Date=HASH(0xacdfb50)<-- 
from 0 to 0
<-
Software error:

Can't call method "value" on an undefined value at '@val = $delta->value();'

То есть две даты пройдены в порядке,У меня НЕТ ошибок, когда он пытается установить свои конфигурационные файлы. Независимо от того, массивы значений @t и @f пусты, и они выходят из строя, как только я пытаюсь получить дельту.

Однако, если яраскомментируйте две строки

   $from->parse("2012-03-06");
   $to->parse("2012-03-07");

(следовательно, игнорируя параметры). Он работает просто отлично, как и предполагалось.

Есть что-то, что я пропускаю в передаче объектов в Perl, я подозреваю?

Во-первых &get_overlap_duration($saved[$i][5], $saved[$i][6], $saved[$i][7], $saved[$i][8]) Вызывается, я напечатал @saved значения, и они правильные, они строки: 2012-03-06, 2012-03-08, 2012-03-05, 2012-03-07

Затем внутри get_overlap_duration эти строки

my $from1 = new Date::Manip::Date;
my $to1 = new Date::Manip::Date;
my $from2 = new Date::Manip::Date;
my $to2 = new Date::Manip::Date;

$from1->parse($_[0]);
$to1->parse($_[1]);
$from2->parse($_[2]);
$to2->parse($_[3]);

Затем есть вызов для get_duration, например $duration = get_duration($from2, $to1);

Я проверил журнал ошибок сервера, не было жалоб, кроме ошибки программного обеспечения, отображаемой в браузере.

1 Ответ

3 голосов
/ 16 февраля 2012

Проблема в том, что в следующей строке:

        my $delta = $from->calc($to, "business");

Это не возвращает действительный объект.Что, вероятно, означает, что что-то в функции calc () не работает.Так как «бизнес» не является действительной датой.И если вы читаете страницу справочника Date :: Manip :: Calc, параметр mode допустим только в том случае, если вы передали два объекта даты до этого и передали только один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...