tokuhirom's Blog

crontab のパーズには Config::Crontab

crontab(5) をパーズしたいときには Config::Crontab をつかうと簡単にできるようだ。vixie cron の形式がひととおりパーズできている様子。

以下サンプルコード。コメントアウトされている行も $line->active が 0 な状態でとれてくるのでかならずチェックしなくてはいけないことに注意しなくてはならない。

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use 5.010000;
use Config::Crontab;
use Data::Dumper;

my $fname = shift or die "Usage: $0 fname\n";

my $parser = Config::Crontab->new();
$parser->read(-file => $fname);

$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
my @result;
for my $block ($parser->blocks) {
    for my $line ($block->lines) {
        if ($line->isa('Config::Crontab::Event')) {
            print Dumper(
                {
                    active => $line->active,
                    datetime => $line->datetime,
                    command => $line->command,
                    type => 'event',
                },
            );
        } elsif ($line->isa('Config::Crontab::Env')) {
            print Dumper(
                {
                    active => $line->active,
                    name => $line->name,
                    value => $line->value,
                    type => 'env',
                },
            );
        }
    }
}