Как выполнить функцию, используя объекты DateTime? - PullRequest
3 голосов
/ 16 августа 2010

Я хочу, чтобы мой .pl выполнял функцию в конце каждого дня, недели и месяца.Функция в конце дня извлекает целое число из HTML и сохраняет его в формате .txt, который будет использоваться для создания графика.

Я уже знаю, как реализовать CGI и JS со скриптом Perl, так что это не проблема.Мне просто не ясно, могут ли объекты DateTime использоваться этим логическим способом.Это звучит просто, поэтому я надеюсь, что есть простой ответ.

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Неясно, ДОЛЖНО ли ваше решение быть универсальным или нет.

Если НЕ all-perl, вы можете сделать что-то «в конце каждого дня» и «в конце каждой недели» (последнее означает просто конец воскресенья), используя планировщик вашей системы (cron в Unix / Linux / MacOS, AT пр Планировщик Windows в Windows).

В конце месяца вы можете запускать скрипт каждый день, но в начале, выходить, если не конец месяца. Логика для конца месяца (и конца недели в качестве бонуса) будет использовать что-то вроде:

use Time::Local qw ( timelocal_nocheck ); 
my @time_data = localtime() ; 
my $current_dom = $time_data[3];
my $current_dow = $time_data[6];
$time_data[4]++;   # Next month.
$time_data[3] = 0; # Last day of previous month.
@time_data = localtime ( timelocal_nocheck ( @time_data ) );
if ($current_dom == $time_data[3]) {
    # Do end of month processing
}
if ($current_dow == 0) { # Sunday
    # Do end of week processing
}

Наконечник шляпы: http://www.perlmonks.org/?node_id=418897

0 голосов
/ 17 августа 2010

Вот простой пример использования DateTime для запуска функции:

use 5.012;
use warnings;
use DateTime;

my $now = DateTime->now;

# example queue
my @jobs = (
    { after => $now->clone->subtract( hours => 1 ), sub => undef },  # done
    { after => $now->clone->subtract( hours => 1 ), sub => sub{ say "late"  }},
    { after => $now->clone,                         sub => sub{ say "now"  }},
    { after => $now->clone->add( hours => 1 ),      sub => sub{ say "not yet" }},
);

for my $job (@jobs) {
    if ($job->{after} <= $now && $job->{sub}) {
        $job->{sub}->();
        $job->{sub} = undef;   # ie. clear from queue
    }
}

Выше будет работать только late & now.

В CPAN есть несколько модулей DateTime, которые могут помочь в дальнейшем.

В качестве альтернативы существует полный клон крона, называемый Schedule::Cron

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...