如何修改Perl DateTime对象?

Gur*_*rzo 2 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";
}
Run Code Online (Sandbox Code Playgroud)

哪个应该得到当前日期,然后一个星期前,等等.可悲的是,在得到正确的当前日期后,它不起作用,我不知道什么是错的.

Error message is "Can't call method "subtract" without a package or object reference [...]", 
Run Code Online (Sandbox Code Playgroud)

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

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

eld*_*his 10

Datetime->now->ymd是标量(字符串,它出现),而不是对象/引用.你不能打电话subtract,因为它不存在.您可能只想ymd在分配给$date以下时尝试省略该部分:

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

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

...
Run Code Online (Sandbox Code Playgroud)

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

my ($date) = DateTime->now;
...
my ($ymd) = $date->ymd;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅CPAN页面.


Eth*_*her 6

如果您尝试使用Data :: Dumper,$date您会立即看到问题所在:$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";
}
Run Code Online (Sandbox Code Playgroud)

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

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