Как я могу изменить объект Perl DateTime? - PullRequest
2 голосов
/ 11 октября 2010

В моем скрипте мне нужно сделать такой цикл:

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 ]

10 голосов
/ 11 октября 2010

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 .

6 голосов
/ 11 октября 2010

Если вы попытаетесь использовать 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";
}

PS. Этот код можно еще больше упростить, комбинируя циклы:

my $date = DateTime->now;
for my $weeks (0..4)
{
    print $date->ymd, "\n";
    $date = $date->subtract(days => 7);    
}
3 голосов
/ 11 октября 2010

Лучше делать ymd при печати, после расчетов и работы с объектом Date.

См. Разницу при переключении при вызове 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();
...