在我的剧本中,我需要像这样做一个循环:
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或将其替换为另一个模块(可能不超过一个)。
答案 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。
查看调用ymd
和subtract
时切换时的差异:
#!/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();