Perl sub不希望将传递的对象用作参数

时间:2012-02-16 15:10:49

标签: perl oop date

我将两个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 个答案:

答案 0 :(得分:3)

问题在于以下一行:

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

它没有返回有效的对象。这可能意味着calc()函数中的某些内容失败了。由于“业务”不是有效日期。如果您阅读Date :: Manip :: Calc手册页,mode参数仅在您之前传入两个日期对象并且您只传递了一个时才合法。