Algorithm-Cron
view release on metacpan or search on metacpan
lib/Algorithm/Cron.pm view on Meta::CPAN
use constant {
TM_SEC => 0,
TM_MIN => 1,
TM_HOUR => 2,
TM_MDAY => 3,
TM_MON => 4,
TM_YEAR => 5,
TM_WDAY => 6,
};
=head1 CONSTRUCTOR
=cut
=head2 $cron = Algorithm::Cron->new( %args )
Constructs a new C<Algorithm::Cron> object representing the given schedule
relative to the given time base. Takes the following named arguments:
=over 8
=item base => STRING
Gives the time base used for scheduling. Either C<utc> or C<local>.
=item crontab => STRING
Gives the crontab schedule in 5 or 6 space-separated fields.
=item sec => STRING, min => STRING, ... mon => STRING
Optional. Gives the schedule in a set of individual fields, if the C<crontab>
field is not specified.
=back
=cut
sub new
{
my $class = shift;
my %params = @_;
my $base = delete $params{base};
grep { $_ eq $base } qw( local utc ) or croak "Unrecognised base - should be 'local' or 'utc'";
if( exists $params{crontab} ) {
my $crontab = delete $params{crontab};
s/^\s+//, s/\s+$// for $crontab;
my @fields = split m/\s+/, $crontab;
@fields >= 5 or croak "Expected at least 5 crontab fields";
@fields <= 6 or croak "Expected no more than 6 crontab fields";
@fields = ( "0", @fields ) if @fields < 6;
@params{ @FIELDS_CTOR } = @fields;
}
$params{sec} = 0 unless exists $params{sec};
my $self = bless {
base => $base,
}, $class;
foreach ( @FIELDS_CTOR ) {
next unless exists $params{$_};
$self->{$_} = _expand_set( delete $params{$_}, $_ );
!defined $self->{$_} or scalar @{ $self->{$_} } or
croak "Require at least one value for '$_' field";
}
return $self;
}
=head1 METHODS
=cut
=head2 @seconds = $cron->sec
=head2 @minutes = $cron->min
=head2 @hours = $cron->hour
=head2 @mdays = $cron->mday
=head2 @months = $cron->mon
=head2 @wdays = $cron->wday
Accessors that return a list of the accepted values for each scheduling field.
These are returned in a plain list of numbers, regardless of the form they
were specified to the constructor.
Also note that the list of valid months will be 0-based (in the range 0 to 11)
rather than 1-based, to match the values used by C<localtime>, C<gmtime>,
C<mktime> and C<timegm>.
=cut
foreach my $field ( @FIELDS_CTOR ) {
no strict 'refs';
*$field = sub {
my $self = shift;
@{ $self->{$field} || [] };
};
}
sub next_time_field
{
my $self = shift;
my ( $t, $idx ) = @_;
my $funcs = $time_funcs{$self->{base}};
my $spec = $self->{ $FIELDS[$idx] } or return 1;
my $old = $t->[$idx];
my $new;
( run in 1.249 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )