Perl - 日付処理

今日から後ろ10日間、とか、今日から前 10 日間の日付を欲しいときイテレータを使うとラク。

#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use Time::Piece;
use Time::Seconds;

my $iterator = date_iterator(
    base   => Time::Piece->new,
    during => +10, # -10 で前 10 日間になる
);

while (my $date = $iterator->()) {
    # do something
    say $date->ymd;
}

sub date_iterator {
    my %arg    = @_;
    my $base   = delete $arg{base};
    my $during = delete $arg{during};
    my $sign   = $during / abs($during);
    $during    = $sign * $during;

    my $i = -1;
    sub {
        $i++;
        return unless $i < $during;
        $base + $sign * ONE_DAY * $i;
    };
}