0

以下のスクリプトがあります。入力データは日付です。私がする必要があるのは、1週間以内の日付を除外して「0」に置き換え、2週間前の日付を「1」に置き換えることです。他の日付は削除する必要があります(私はそこにそれを取得していません)。これがスクリプトですが、機能していないようです。

    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;

    }

助けてくれてありがとう。

4

1 に答える 1

2

3つの値を返すサブを要求しています。ここで、値の1つはフィルタリングの必要性を示し、それらの値の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)
}
于 2013-02-26T11:18:12.067 に答える