2013-02-26 81 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