如何修改Perl DateTime对象?

时间:2010-10-11 17:09:13

标签: perl datetime date

在我的剧本中,我需要像这样做一个循环:

use DateTime;
for $j(0..3){
    my ($date) = DateTime->now->ymd;
    my ($k) = 0;
    while($k <= $j){
        $date = ($date->subtract( days => 7));
        $k++;
    }
print "$date\n";
}

应该得到当前日期,然后是一周前等等。可悲的是,在得到正确的当前日期后,它不起作用,我不知道出了什么问题。

Error message is "Can't call method "subtract" without a package or object reference [...]", 

但我不知道如何解决这个问题。

如果可能,我想继续使用DateTime或将其替换为另一个模块(可能不超过一个)。

3 个答案:

答案 0 :(得分:10)

Datetime->now->ymd是标量(字符串,它出现),而不是对象/引用。您无法在其上调用subtract,因为它不存在。您可能只想在分配到ymd时尝试省略$date部分:

my ($date) = DateTime->now;
...

for(0..$j) {
    $date = ($date->subtract( days => 7));
}

...

如果要访问ymd值,请在创建对象后执行此操作:

my ($date) = DateTime->now;
...
my ($ymd) = $date->ymd;

有关详情,请参阅CPAN页面。

答案 1 :(得分:6)

如果您尝试在$date上使用Data::Dumper,您会立即看到问题所在:$date是一个字符串,而不是一个对象。您应该延迟在其上调用ymd(),直到需要对其进行字符串化。

use strict;
use warnings;

use DateTime;

for my $j (0..3)
{
    my $date = DateTime->now;
    $date = $date->subtract(days => 7) for (0 .. $j);
    print $date->ymd, "\n";
}

PS。通过组合循环可以更简化此代码:

my $date = DateTime->now;
for my $weeks (0..4)
{
    print $date->ymd, "\n";
    $date = $date->subtract(days => 7);    
}

答案 2 :(得分:3)

在计算和处理Date对象之后,最好在打印时执行ymd。

查看调用ymdsubtract时切换时的差异:

#!/usr/bin/perl -w    

use strict;    
use Data::Dumper;
use DateTime;

   sub main{   
      my $date = DateTime->now->subtract(days=>7)->ymd;
      print "$date\n\n";
   }    

   main();