我希望我的.pl在每天,每週和每月的最後執行一個函數。該函數的功能是在一天結束時從html中獲取一個整數,並將其存儲在一個.txt文件中,以用於創建圖形。如何使用DateTime對象執行函數?
我已經知道如何用perl腳本實現CGI和JS,所以這沒有問題。我只是不清楚DateTime對象是否可以以這種布爾類型的方式使用。這聽起來很簡單,所以我希望有一個簡單的答案。
我希望我的.pl在每天,每週和每月的最後執行一個函數。該函數的功能是在一天結束時從html中獲取一個整數,並將其存儲在一個.txt文件中,以用於創建圖形。如何使用DateTime對象執行函數?
我已經知道如何用perl腳本實現CGI和JS,所以這沒有問題。我只是不清楚DateTime對象是否可以以這種布爾類型的方式使用。這聽起來很簡單,所以我希望有一個簡單的答案。
目前還不清楚您的解決方案是否必須全部或不全。
如果不是全部perl,則可以使用系統的調度程序(在Unix/Linux上爲cron
)「在每天結束時」和「在每週結束時」(後者僅表示星期日結束)/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
}
下面是如何使用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
道歉含糊一個完整的cron克隆,但它的目的是成爲一個全面的解決方案perl的,謝謝。這有很大幫助。 – Dorian 2010-08-16 20:40:00