2013-02-26 58 views
0

我有下面的腳本。輸入數據是日期。我需要做的是過濾掉不超過一週的日期,並用'0'替換它,兩週後替換爲'1'。其他日期應該刪除(我沒有得到它)​​。這是腳本,但它似乎並沒有工作:Perl腳本替換數據

use Date::Parse; 
    use Date::Format; 
    use Date::Manip; 

    sub f { 

    my $x = shift; 
    my $env = shift; 

    my $time = str2time($x); 
    my $oneweekold = str2time(time2str('%Y-%m-%d 00:00:00', (time()-60*60*24*7))); 
    my $twoweeksold = str2time(time2str('%Y-%m-%d 00:00:00', (time()-60*60*24*14))); 

    return '0' if $time < $oneweekold; 
    return '1' if $time < $twoweeksold; 

    return $x; 

    } 

感謝您的任何幫助。

+0

請加樣品輸入 – ikegami 2013-02-26 10:49:10

+1

注意,在它與24 * 60 * 60的任何答案是錯的,因爲不是所有的天都有24小時。 – ikegami 2013-02-26 10:49:54

回答

2

你要求一個返回三個值的子,其中一個值表示需要過濾,其中兩個值是實際值。這是一團糟。

相反,讓我們寫一個返回週數前的子集。你可以過濾,並根據這個格式輸出。

use strict; 
use warnings; 
use feature qw(say); 

use Date::Parse qw(str2time); 
use DateTime qw(); 

# ...  
# -2 = 7..13 days from now. 
# -1 = 0.. 6 days from now. 
# 0 = 1.. 7 days ago. 
# 1 = 8..14 days ago. 
# ... 
sub weeks_ago { 
    my ($ref, $dt) = @_; 
    if ($dt >= $ref) { 
     return -int(($ref->delta_days($dt)->in_units('days') + 7)/7); 
    } else { 
     return int(($ref->delta_days($dt)->in_units('days') - 1)/7); 
    } 
} 

my $ref = DateTime->today(time_zone => 'local'); 

my $dt = DateTime->from_epoch(epoch => str2time('2013:03:27T08:08:17.1823213')); 
my $weeks_ago = weeks_ago($ref, $dt); 
if (0 <= $weeks_ago && $weeks_ago <= 1) { # Filtering 
    say $weeks_ago;       # Formatting (Actually, none needed) 
} 
+0

@ user1240622,已更新。 – ikegami 2013-02-26 11:32:45