2010-08-16 57 views
3

我希望我的.pl在每天,每週和每月的最後執行一個函數。該函數的功能是在一天結束時從html中獲取一個整數,並將其存儲在一個.txt文件中,以用於創建圖形。如何使用DateTime對象執行函數?

我已經知道如何用perl腳本實現CGI和JS,所以這沒有問題。我只是不清楚DateTime對象是否可以以這種布爾類型的方式使用。這聽起來很簡單,所以我希望有一個簡單的答案。

回答

3

目前還不清楚您的解決方案是否必須全部或不全。

如果不是全部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 
} 

帽尖:http://www.perlmonks.org/?node_id=418897

+0

道歉含糊一個完整的cron克隆,但它的目的是成爲一個全面的解決方案perl的,謝謝。這有很大幫助。 – Dorian 2010-08-16 20:40:00

0

下面是如何使用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