2010-10-11 2 views
1

В моем сценарии мне нужно сделать цикл, как этот:Как изменить объект Perl DateTime?

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 или заменить его другим модулем (возможно, не более одного).

+1

Где $ J множество? –

+0

Извините, написал его без копирования. $ i - $ j. – Gurzo

+1

Этот цикл while лучше написан 'for (0 .. $ j) {...}' – Ether

ответ

9

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.

+0

Да, я испортил это. =) Спасибо – Gurzo

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"; 
} 

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

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

Действительно ли это на этой неделе, или было неуклонное признание вопросов людьми, которые даже не удосужились проверить ценности или попробовать что-нибудь, чтобы отладить свои проблемы? Мне кажется очень странным, потому что в большинстве случаев уровень мастерства испытуемого, кажется, указывает, что они должны знать этот материал. –

+0

@brian: в последнее время похоже немного вверх. Интересно, связано ли это с началом нового учебного года (в северном полушарии). – Ether

3

Это лучше делать 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(); 
Смежные вопросы